Чтение больших CSV файлов в pandas без ошибок памяти

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для эффективного использования оперативной памяти при работе с большими CSV-файлами в pandas используется параметр chunksize. Данный параметр позволяет обрабатывать данные по частям, избегая загрузки всего содержимого файла в память сразу.

Python
Скопировать код
import pandas as pd

# Выберите подходящий размер чанка
chunk_size = 10000

# Чтение файла по частям
chunks = pd.read_csv('large_file.csv', chunksize=chunk_size)

# Обработка каждого чанка по отдельности
for chunk in chunks:
    # Ваш код здесь...
Кинга Идем в IT: пошаговый план для смены профессии

Ключевые стратегии для эффективной обработки

Использование контекстного менеджера для экономии памяти

Начиная с pandas версии 1.2, вы можете автоматически освобождать использованные ресурсы после обработки файла с помощью контекстного менеджера:

Python
Скопировать код
with pd.read_csv('large_file.csv', chunksize=chunk_size) as reader:
    for chunk in reader:
        # Вставьте ваши операции здесь

Минимизация объёма памяти

Чтобы дополнительно сократить количество используемой памяти, отфильтруйте только необходимые столбцы и предопределите их типы данных:

Python
Скопировать код
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 и агрегация могут быть эффективно применены для обработки и анализа данных по частям:

Python
Скопировать код
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-файл как гигантский багет, а память вашего компьютера – как тостер.

Markdown
Скопировать код
🍞: Гигантский CSV-файл
🔥: Ваш компьютер

Вместо того, чтобы пытаться засунуть весь багет в тостер, мы нарезаем его на стандартные порции:

Python
Скопировать код
pd.read_csv('endless_loaf.csv', chunksize=one_decent_slice)

Подобным образом, каждая "порция" (chunksize) данных обрабатывается отдельно и не перегружает систему!

Markdown
Скопировать код
🍞🍞🍞 ➡️ 🔥 = Порционная обработка данных, без перегрузки памяти!

Вы способны эффективно работать с данными, не создавая излишней нагрузки на систему.

Продвинутые стратегии обработки и оптимизации больших CSV-файлов

Промежуточное сохранение в формате Pickle

Если вам предстоит выполнить многократные операции над данными, советуем временно сохранять чанки в формате pickle:

Python
Скопировать код
for i, chunk in enumerate(chunks):
    chunk.to_pickle(f'tasty_chunk_{i}.pkl')

При дальнейшем анализе данных вы можете извлекать чанки, используя модуль glob.

Отслеживание времени выполнения

Регулярно контролируйте время выполнения операций, чтобы быстро выявлять и оптимизировать узкие места.

Парсинг даты и времени

Парсинг дат при чтении CSV файла упрощает дальнейшую работу с этими данными:

Python
Скопировать код
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-функции могут быть полезны для выполнения операций на уровне строк:

Python
Скопировать код
chunk['new_column'] = chunk.apply(lambda row: my_func(row), axis=1)

Чтение файлов с нестандартными разделителями

Если в файле используется табуляция или любой другой разделитель, используйте функцию pd.read_table:

Python
Скопировать код
chunks = pd.read_table('large_file.tsv', names=['col1', 'col2'], chunksize=chunk_size)

Полезные материалы

  1. pandas.read_csv — документация pandas 2.2.0 — подробное описание функции read_csv.
  2. Иерархическое индексирование в Python — советы по использованию иерархического индексирования при работе с большими наборами данных.
  3. Как обработать большой CSV-файл с помощью pandas? – Stack Overflow — полезные рекомендации и советы сообщества по обработке больших CSV-файлов.
  4. Улучшение производительности — документация pandas 2.2.0 — советы по написанию высокопроизводительного кода в pandas.
  5. Обработка больших CSV-файлов с помощью pandas — Medium — техники повышения производительности при работе с pandas.
  6. Создание DataFrame в pandas из списков и словарей – Практический бизнес Python — использование чанков в работе с массивными наборами данных.
  7. Обработка больших наборов данных с помощью pandas – YouTube — видеоурок по обработке больших наборов данных с помощью pandas.