Я пытаюсь прочитать большой CSV-файл (около 6 ГБ) в пандах, и я получаю ошибку памяти:
MemoryError Traceback (most recent call last)
<ipython-input-58-67a72687871b> in <module>()
----> 1 data=pd.read_csv('aphro.csv',sep=';')
...
MemoryError:
Любая помощь в этом?
Ответы:
Ошибка показывает, что на машине недостаточно памяти для одновременного считывания всего CSV-файла в DataFrame. Предполагая, что вам не нужен весь набор данных в памяти одновременно, один из способов избежать этой проблемы - обработать CSV порциями (указав
chunksize
параметр):chunksize
Параметр определяет количество строк на порцию. (chunksize
Конечно, последний блок может содержать меньше строк)источник
DF.append(chunk)
внутри цикла. Это будет использоватьO(N^2)
операции копирования. Лучше добавить агрегированные данные в список , а затем построить DataFrame из списка с одного вызова кpd.DataFrame
илиpd.concat
( в зависимости от типа агрегированных данных).DF.append(chunk)
в цикле требуетO(N^2)
операций копирования, гдеN
размер блоков, потому что каждый вызовDF.append
возвращает новый DataFrame. Вызовpd.DataFrame
илиpd.concat
один раз вне цикла уменьшает количество копий вO(N)
.chunksize
параметр относится к количеству строк на чанк.chunksize
Конечно, последний блок может содержать меньше строк.pd.concat([list_of_dfs])
один раз после цикла намного быстрее, чем вызов,pd.concat
илиdf.append
много раз внутри цикла. Конечно, вам понадобится значительное количество памяти, чтобы вместить весь 6 ГБ csv в один DataFrame.Чанкинг не всегда должен быть первым портом захода для этой проблемы.
Является ли файл большим из-за повторяющихся нечисловых данных или нежелательных столбцов?
Если это так, вы можете иногда видеть значительную экономию памяти, читая в столбцах категории и выбирая необходимые столбцы с помощью параметра pd.read_csv
usecols
.Ваш рабочий процесс требует нарезки, манипуляции, экспорта?
Если это так, вы можете использовать dask.dataframe для нарезки , выполнения своих вычислений и многократного экспорта. Чанкинг выполняется dask без вывода сообщений, который также поддерживает подмножество API pandas.
Если ничего не помогает, читайте построчно через чанки.
Кусок через панд или через библиотеку csv в крайнем случае.
источник
Я поступил так:
источник
read_csv
наread_table
?Для больших данных я рекомендую использовать библиотеку "dask",
например:
Вы можете прочитать больше из документации здесь .
Еще одна отличная альтернатива - использовать модин, потому что все функции идентичны пандам, но он используется в библиотеках распределенных фреймов данных, таких как dask.
источник
Приведенный выше ответ уже удовлетворяет тему. В любом случае, если вам нужны все данные в памяти - взгляните на bcolz . Это сжатие данных в памяти. У меня был действительно хороший опыт с этим. Но его хватает много функций панд
Изменить: Я получил степень сжатия около 1/10 или оригинального размера, я думаю, конечно, в зависимости от типа данных. Важными недостающими чертами были агрегаты.
источник
chunks
упомянутый метод, а затем использовать bcolz, если для анализа вам нужны все данные в памяти. Просто мысль.Вы можете читать данные как куски и сохранять каждый кусок как рассол.
На следующем шаге вы читаете в рассолах и добавляете каждый рассол к желаемому фрейму данных.
источник
df
полностью помещается в память (как подразумевается) и содержит тот же объем данных, что и входные данные, вам, конечно, вообще не нужно разбивать на части?Функции read_csv и read_table практически одинаковы. Но вы должны назначить разделитель «,», когда вы используете функцию read_table в вашей программе.
источник
Решение 1:
Использование панд с большими данными
Решение 2:
источник
dfList.append
, просто обрабатывайте каждый чанк (df
) отдельноВот следующий пример:
источник
Вы можете попробовать sframe, который имеет тот же синтаксис, что и pandas, но позволяет вам манипулировать файлами, которые больше вашей оперативной памяти.
источник
Если вы используете панды для чтения большого файла в чанк, а затем выводите строку за строкой, вот что я сделал
источник
Я хочу дать более полный ответ, основанный на большинстве потенциальных решений, которые уже предоставлены. Я также хочу указать на еще одну потенциальную помощь, которая может помочь процессу чтения.
Вариант 1: dtypes
«dtypes» - довольно мощный параметр, который вы можете использовать для уменьшения нагрузки на память
read
методов. Смотрите это и этот ответ. Панды, по умолчанию, пытаются определить типы данных.Обращаясь к структурам данных, для каждой сохраненной информации происходит распределение памяти. На базовом уровне обратитесь к значениям ниже (в таблице ниже приведены значения для языка программирования C):
Обратитесь к этой странице, чтобы увидеть соответствие между типами NumPy и C.
Допустим, у вас есть массив целых чисел . Вы можете как теоретически, так и практически назначить, скажем, массив 16-битного целочисленного типа, но тогда вы выделите больше памяти, чем вам нужно для хранения этого массива. Чтобы предотвратить это, вы можете установить
dtype
опцию наread_csv
. Вы не хотите хранить элементы массива в виде длинного целого числа, где на самом деле вы можете поместить их в 8-битное целое число (np.int8
илиnp.uint8
).Обратите внимание на следующую карту dtype.
Источник: https://pbpython.com/pandas_dtypes.html
Вы можете передать
dtype
параметр в качестве параметра в методах pandas как параметрread
типа {column: type}.Вариант 2: Чтение чанками
Чтение данных по частям позволяет вам получить доступ к части данных в памяти, и вы можете применить предварительную обработку к вашим данным и сохранить обработанные данные, а не необработанные данные. Было бы намного лучше, если бы вы комбинировали эту опцию с первой, dtypes .
Я хочу указать разделы поваренной книги панд для этого процесса, где вы можете найти их здесь . Обратите внимание на эти два раздела там;
Вариант 3: Dask
Dask - это фреймворк, который определен на веб-сайте Dask как:
Он был рожден, чтобы покрыть необходимые части, куда панды не могут добраться. Dask - это мощная инфраструктура, которая предоставляет вам гораздо больший доступ к данным за счет их распределенной обработки.
Вы можете использовать dask для предварительной обработки ваших данных в целом, Dask заботится о фрагментации, поэтому в отличие от pandas, вы можете просто определить этапы обработки и позволить Dask выполнять всю работу. Dask не применяет вычисления до тех пор, пока они явно не выдвинуты
compute
и / илиpersist
( разницу см. В ответе здесь ).Другие средства (идеи)
источник
В дополнение к ответам выше, для тех, кто хочет обработать CSV и затем экспортировать в csv, parquet или SQL, d6tstack является еще одним хорошим вариантом. Вы можете загрузить несколько файлов, и это имеет дело с изменениями схемы данных (добавлены / удалены столбцы). Поддержка Chunked из ядра уже встроена.
источник
В случае, если кто-то все еще ищет что-то подобное, я обнаружил, что эта новая библиотека под названием modin может помочь. Он использует распределенные вычисления, которые могут помочь с чтением. Вот хорошая статья, сравнивающая его функциональность с пандами. По сути, он использует те же функции, что и панды.
источник
modin
сравнивается с устоявшимсяdask.dataframe
? Например, см. Переход от панд к даску, чтобы использовать все локальные ядра процессора .Прежде чем использовать опцию chunksize, если вы хотите быть уверены в функции процесса, которую вы хотите записать внутри цикла for chunking, как упомянуто @unutbu, вы можете просто использовать опцию nrows.
Как только вы убедитесь, что блок процесса готов, вы можете поместить его в цикл chunking for для всего кадра данных.
источник