Комментарий пользователя
Здравствуйте! Нужна утилита, которая читает CSV с миллионами строк и пишет в БД. Pandas не влазит в память — что делать?
Ответ специалиста
Здравствуйте, Андрей! Главное — не пытайтесь загрузить весь файл в память. Читайте данные построчно или чанками и сразу пишите в БД.
Базовый вариант — стандартный модуль csv и пакетная вставка:
import csv
import psycopg2
def process_stream(path, dsn, batch_size=1000):
conn = psycopg2.connect(dsn)
cur = conn.cursor()
with open(path, newline='', encoding='utf-8') as f:
reader = csv.reader(f)
next(reader)
batch = []
for row in reader:
batch.append(row)
if len(batch) >= batch_size:
cur.executemany("INSERT INTO table (a,b,c) VALUES (%s,%s,%s)", batch)
batch.clear()
if batch:
cur.executemany("INSERT INTO table (a,b,c) VALUES (%s,%s,%s)", batch)
conn.commit()
cur.close()
conn.close()
Если важна скорость, для PostgreSQL лучше использовать COPY вместо executemany — это обычно на порядок быстрее. Логика та же: читаем файл как поток, база сама оптимально проглатывает данные.
Если удобнее работать через pandas, не отказывайтесь от нее полностью, а добавьте чтение чанками:
import pandas as pd
for chunk in pd.read_csv('big.csv', chunksize=100_000):
обработка(chunk)
# запись в БД батчами
Excel‑файлы лучше конвертировать в CSV (через pandas.read_excel(...).to_csv(...)) или читать по листам и строкам.
Если ответ помог — добро пожаловать в Академию Selectel. Регулярно публикуем гайды по ЯП, настройкам и разным технологиям.