Чтение больших CSV файлов в pandas без ошибок памяти
Быстрый ответ
Для эффективного использования оперативной памяти при работе с большими CSV-файлами в pandas используется параметр chunksize
. Данный параметр позволяет обрабатывать данные по частям, избегая загрузки всего содержимого файла в память сразу.
import pandas as pd
# Выберите подходящий размер чанка
chunk_size = 10000
# Чтение файла по частям
chunks = pd.read_csv('large_file.csv', chunksize=chunk_size)
# Обработка каждого чанка по отдельности
for chunk in chunks:
# Ваш код здесь...
Ключевые стратегии для эффективной обработки
Использование контекстного менеджера для экономии памяти
Начиная с pandas версии 1.2, вы можете автоматически освобождать использованные ресурсы после обработки файла с помощью контекстного менеджера:
with pd.read_csv('large_file.csv', chunksize=chunk_size) as reader:
for chunk in reader:
# Вставьте ваши операции здесь
Минимизация объёма памяти
Чтобы дополнительно сократить количество используемой памяти, отфильтруйте только необходимые столбцы и предопределите их типы данных:
selected_types = {'id': 'int32', 'value': 'float32'}
selected_cols = ['id', 'value', 'stamp']
chunks = pd.read_csv('large_file.csv', usecols=selected_cols, dtype=selected_types, chunksize=chunk_size)
Также рекомендуется использовать категориальные типы данных для ещё большего снижения нагрузки.
Группировка и агрегация данных
Методы groupby
и агрегация могут быть эффективно применены для обработки и анализа данных по частям:
aggregated_chunks = []
for chunk in pd.read_csv('large_file.csv', chunksize=chunk_size):
aggregated = chunk.groupby(['category']).agg('sum')
aggregated_chunks.append(aggregated)
final_df = pd.concat(aggregated_chunks)
Использование распределенных вычислений
Рассмотрите использование распределенных df-библиотек, таких как dask.dataframe
и modin
, которые расширяют функциональность pandas, позволяя обрабатывать данные параллельно на разных процессорных ядрах или серверах.
Визуализация
Представьте CSV-файл как гигантский багет, а память вашего компьютера – как тостер.
🍞: Гигантский CSV-файл
🔥: Ваш компьютер
Вместо того, чтобы пытаться засунуть весь багет в тостер, мы нарезаем его на стандартные порции:
pd.read_csv('endless_loaf.csv', chunksize=one_decent_slice)
Подобным образом, каждая "порция" (chunksize) данных обрабатывается отдельно и не перегружает систему!
🍞🍞🍞 ➡️ 🔥 = Порционная обработка данных, без перегрузки памяти!
Вы способны эффективно работать с данными, не создавая излишней нагрузки на систему.
Продвинутые стратегии обработки и оптимизации больших CSV-файлов
Промежуточное сохранение в формате Pickle
Если вам предстоит выполнить многократные операции над данными, советуем временно сохранять чанки в формате pickle:
for i, chunk in enumerate(chunks):
chunk.to_pickle(f'tasty_chunk_{i}.pkl')
При дальнейшем анализе данных вы можете извлекать чанки, используя модуль glob
.
Отслеживание времени выполнения
Регулярно контролируйте время выполнения операций, чтобы быстро выявлять и оптимизировать узкие места.
Парсинг даты и времени
Парсинг дат при чтении CSV файла упрощает дальнейшую работу с этими данными:
chunks = pd.read_csv('large_file.csv', parse_dates=['timestamp'], chunksize=chunk_size)
Чтение файлов напрямую из S3
Pandas может читать CSV-файлы из S3-бакета без промежуточных сохранений на локальное устройство. Достаточно передать ссылку в формате 's3://.../path/to/file.csv' функции pd.read_csv
.
Использование индексов при чтении файла
Примените индексы при чтении файла – это значительно облегчит дальнейший поиск и обработку данных.
Использование lambda-функций для обработки данных
Lambda-функции могут быть полезны для выполнения операций на уровне строк:
chunk['new_column'] = chunk.apply(lambda row: my_func(row), axis=1)
Чтение файлов с нестандартными разделителями
Если в файле используется табуляция или любой другой разделитель, используйте функцию pd.read_table
:
chunks = pd.read_table('large_file.tsv', names=['col1', 'col2'], chunksize=chunk_size)
Полезные материалы
- pandas.read_csv — документация pandas 2.2.0 — подробное описание функции
read_csv
. - Иерархическое индексирование в Python — советы по использованию иерархического индексирования при работе с большими наборами данных.
- Как обработать большой CSV-файл с помощью pandas? – Stack Overflow — полезные рекомендации и советы сообщества по обработке больших CSV-файлов.
- Улучшение производительности — документация pandas 2.2.0 — советы по написанию высокопроизводительного кода в pandas.
- Обработка больших CSV-файлов с помощью pandas — Medium — техники повышения производительности при работе с pandas.
- Создание DataFrame в pandas из списков и словарей – Практический бизнес Python — использование чанков в работе с массивными наборами данных.
- Обработка больших наборов данных с помощью pandas – YouTube — видеоурок по обработке больших наборов данных с помощью pandas.