Короткий ответ
Файл читают по частям через pd.read_csv(..., chunksize=N), обрабатывая и агрегируя каждый фрагмент отдельно, либо сразу ограничивают используемые столбцы (usecols) и типы данных (dtype), чтобы снизить объём потребляемой памяти.
Как это работает подробнее
chunksize превращает read_csv в итератор, возвращающий DataFrame фиксированного размера по частям; это позволяет обрабатывать файл потоково, сохраняя только промежуточные агрегаты (например, частичные суммы по группам), а не весь файл целиком в памяти.
Пример кода
question-127.py
import pandas as pd
totals = {}
for chunk in pd.read_csv('big_sales.csv', usecols=['category', 'amount'], chunksize=100000):
partial = chunk.groupby('category')['amount'].sum()
for cat, val in partial.items():
totals[cat] = totals.get(cat, 0) + val
print(totals)Что использовать на практике
- Практика. если нужна простая агрегация (сумма, количество по категориям), её можно посчитать накопительно по чанкам и объединить в конце; если задача требует операций над всем набором данных сразу (например, глобальная сортировка или сложный merge), чанкование усложняет логику и может потребовать иных инструментов (например, баз данных или движков типа DuckDB/polars).
- Проверка. сумма по каждой категории в totals должна совпадать с результатом groupby, посчитанным на полном файле целиком (если бы память позволяла), что можно сверить на небольшом тестовом файле.
Подводные камни
- Частая ошибка. читают файл чанками, но затем всё равно собирают все чанки обратно в один большой DataFrame через pd.concat, теряя весь смысл потокового чтения и память не экономя; не указывают usecols и dtype заранее, загружая в память ненужные столбцы, хотя на большом файле это может быть главным источником перерасхода памяти.