Ответ
При вызове pd.read_csv('huge_file.csv') pandas попытается загрузить весь датафрейм в оперативную память (RAM). Если файл превышает доступный объём памяти, это вызовет ошибку MemoryError и скрипт упадёт.
Стратегии обработки больших данных в pandas-стиле:
-
Чтение по частям (Chunking): Самый распространённый метод. Файл считывается и обрабатывается порциями.
import pandas as pd chunk_size = 50_000 # Количество строк в чанке chunk_iterator = pd.read_csv('huge_file.csv', chunksize=chunk_size) aggregated_results = [] for chunk in chunk_iterator: # Обрабатываем каждый чанк независимо (фильтрация, агрегация) processed_chunk = chunk[chunk['value'] > 100].groupby('category').sum() aggregated_results.append(processed_chunk) # Объединяем финальные результаты (они должны быть небольшими) final_df = pd.concat(aggregated_results) -
Оптимизация типов данных: При загрузке сразу уменьшайте потребление памяти.
dtypes = {'user_id': 'int32', 'category': 'category', 'price': 'float32'} df = pd.read_csv('file.csv', dtype=dtypes, usecols=['user_id', 'category', 'price']) -
Использование эффективных форматов хранения: Конвертация в бинарные форматы, которые быстрее читаются и часто занимают меньше места.
# После обработки сохранить в Parquet или Feather df.to_parquet('data.parquet', compression='snappy') # Загрузка будет быстрее и может потребовать меньше памяти. df = pd.read_parquet('data.parquet') -
Использование Dask или Vaex: Для работы с данными, превышающими размер RAM, используйте библиотеки с похожим на pandas API, но работающие с данными на диске или распределённо.
Ответ 18+ 🔞
Ага, слушай, вот реальная ситуация, с которой сталкивался каждый, кто пытался запихнуть в пандас файл размером с твою совесть. Представь: пишешь ты pd.read_csv('huge_file.csv'), расслабляешься, а потом — бац! — MemoryError, и всё, пиздец, скрипт накрылся медным тазом. А всё почему? Потому что пандас, как хороший, но жадный студент на халяве, пытается впихнуть в оперативку всё сразу, до последнего байта. Если файл больше, чем у тебя RAM, будет тебе хиросима и никаких нигерсраков.
Но не спеши бздеть, есть несколько рабочих стратегий, чтобы не охуеть от такого поворота.
1. Чтение по частям (Chunking) Это, бля, классика жанра. Вместо того чтобы жрать слона целиком, откусывай по кусочку. Читаешь файл порциями, обрабатываешь каждую, а результат, который должен быть маленьким, собираешь в кучку.
import pandas as pd
chunk_size = 50_000 # Сколько строк в одном укусе
chunk_iterator = pd.read_csv('huge_file.csv', chunksize=chunk_size)
aggregated_results = []
for chunk in chunk_iterator:
# Тут делаешь с чанком что надо: фильтруешь, группируешь, считаешь
processed_chunk = chunk[chunk['value'] > 100].groupby('category').sum()
aggregated_results.append(processed_chunk)
# А в конце склеиваешь итоговые результаты (главное, чтобы они сами по себе не были овердохуища)
final_df = pd.concat(aggregated_results)
2. Оптимизация типов данных
Ёпта, а ты знал, что пандас по умолчанию может хранить числа как int64 или float64? Это как возить мешок картошки на Камазе. Зачем? Если у тебя user_id до миллиона, хватит и int32. Сразу говори библиотеке, какого типа данные, и отсекай ненужные колонки через usecols. Экономия памяти — просто пиздец.
dtypes = {'user_id': 'int32', 'category': 'category', 'price': 'float32'}
df = pd.read_csv('file.csv', dtype=dtypes, usecols=['user_id', 'category', 'price'])
3. Эффективные форматы хранения CSV — это, конечно, классика, но для больших данных он как телега для переезда. Конвертируй свои данные в бинарные форматы вроде Parquet или Feather. Они и места меньше жрут, и читаются в разы быстрее, иногда даже меньше оперативки требуют.
# Сохранил один раз — и забыл про долгую загрузку
df.to_parquet('data.parquet', compression='snappy')
# А потом грузишь за секунды
df = pd.read_parquet('data.parquet')
4. Dask или Vaex А вот если файл настолько огромный, что даже чанкование не спасает, и терпения ебать ноль, то пора переходить на тяжёлую артиллерию. Библиотеки Dask или Vaex дают API, очень похожий на пандас, но работают они по-другому: либо лениво вычисляют всё на диске, либо распределяют задачи по ядрам процессора. Это уже следующий уровень, когда обычный пандас сдаётся и говорит «иди ты нахуй».
Короче, суть в чём: не пытайся впихнуть невпихуемое. Думай головой, оптимизируй и используй правильные инструменты. А то так и будешь сидеть и смотреть на MemoryError, как Гамлет на призрака отца.