В настоящее время я пытаюсь открыть файл с пандами и python для целей машинного обучения, для меня было бы идеально, чтобы они все были в DataFrame. Теперь размер файла составляет 18 ГБ, а объем оперативной памяти - 32 ГБ, но я получаю ошибки памяти.
Из вашего опыта это возможно? Если нет, знаете ли вы лучший способ обойти это? (таблица кустов - увеличьте размер моей оперативной памяти до 64 - создайте базу данных и получите к ней доступ из python)
pandas
том, что вам нужно иметь 5-10 раз больше оперативной памяти. Я рекомендую делатьinplace
операции, явно вызыватьgarbage.collector
для выделения объектов.Ответы:
Если это CSV-файл, и вам не нужно получать доступ ко всем данным сразу при обучении алгоритму, вы можете прочитать их порциями. Этот
pandas.read_csv
метод позволяет вам прочитать файл в виде фрагментов следующим образом:Вот документация метода
источник
Есть две возможности: либо вам нужно иметь все свои данные в памяти для обработки (например, ваш алгоритм машинного обучения хотел бы использовать все это сразу), либо вы можете обойтись без него (например, ваш алгоритм требует только выборки строк или колонки сразу).
В первом случае вам нужно решить проблему с памятью . Увеличьте объем своей памяти, арендуйте облачный компьютер с большим объемом памяти, используйте операции на месте, предоставьте информацию о типе данных, которые вы читаете, обязательно удалите все неиспользуемые переменные и соберите мусор и т. Д.
Весьма вероятно, что 32 ГБ ОЗУ будет недостаточно для того, чтобы Панды обрабатывали ваши данные. Обратите внимание, что целое число «1» - это один байт, когда он хранится в виде текста, и 8 байт, когда он представлен как
int64
(это значение по умолчанию, когда Pandas считывает его из текста). Вы можете сделать тот же пример с числом с плавающей запятой "1.0", котороеfloat64
по умолчанию расширяется от 3-байтовой строки до 8-байтовой . Вы можете выиграть немного места, давая Pandas точно знать, какие типы использовать для каждого столбца и форсируя наименьшее возможное представление, но мы даже не начали говорить о служебной структуре данных Python здесь, которая может добавить дополнительный или два указателя здесь или там легко и указатели по 8 байт каждый на 64-битной машине.Подводя итог: нет, 32 ГБ ОЗУ, вероятно, недостаточно для того, чтобы Панды обрабатывали файл размером 20 ГБ.
Во втором случае (который более реалистичен и, вероятно, относится к вам), вам необходимо решить проблему управления данными . Действительно, необходимость загрузки всех данных, когда вам действительно нужны только их части для обработки, может быть признаком плохого управления данными. Здесь есть несколько вариантов:
Используйте базу данных SQL. Если вы можете, это почти всегда первый выбор и достаточно комфортное решение. 20 ГБ звучит так, как если бы большинство баз данных SQL справлялись без необходимости распространяться даже на (более дорогих) ноутбуках. Вы сможете индексировать столбцы, выполнять базовые агрегации с помощью SQL и получать необходимые подвыборки в Pandas для более сложной обработки с использованием простого
pd.read_sql
. Перемещение данных в базу данных также даст вам возможность подумать о фактических типах данных и размерах ваших столбцов.Если ваши данные в основном числовые (то есть массивы или тензоры), вы можете рассмотреть возможность их хранения в формате HDF5 (см. PyTables ), что позволяет вам удобно читать только необходимые фрагменты огромных массивов с диска. Базовые numpy.save и numpy.load достигают того же эффекта с помощью сопоставления памяти массивов на диске. Для ГИС и связанных растровых данных существуют выделенные базы данных , которые могут не подключаться к пандам так же напрямую, как SQL, но также должны позволять вам делать срезы и запросы достаточно удобно.
Насколько мне известно, Pandas не поддерживает такое «частичное» отображение памяти в HDF5 или в массивах с нулевыми значениями. Если вам все еще нужно какое-то «чистое панда» решение, вы можете попытаться обойти его путем «разделения»: либо хранить столбцы вашей огромной таблицы отдельно (например, в отдельных файлах или в отдельных «таблицах» одного HDF5). файл) и загружать только необходимые по требованию или хранить фрагменты строк отдельно. Однако затем вам нужно будет реализовать логику загрузки необходимых фрагментов, таким образом, заново изобретая велосипеды, уже внедренные в большинство баз данных SQL, поэтому, возможно, вариант 1 все же будет проще здесь. Если ваши данные поступают в CSV, вы можете обработать их порциями, указав
chunksize
параметр дляpd.read_csv
.источник
У меня только была эта проблема несколько дней назад! Не уверен, поможет ли это в вашем конкретном случае, поскольку вы не предоставляете так много подробностей, но моя ситуация заключалась в том, чтобы работать автономно над «большим» набором данных. Данные были получены в виде сжатых CSV-файлов размером 20 ГБ с счетчиков энергии, данных временных рядов с интервалами в несколько секунд.
Файл IO:
Создайте итератор куска непосредственно над файлом gzip (не распаковывайте!)
Перебирать куски
Внутри чанка я делаю некоторую фильтрацию и повторную выборку по времени. Сделав это, я уменьшил размер HDF5 с 20 ГБ до нескольких сотен МБ для дальнейшего автономного исследования данных.
источник
По моему опыту, инициализация
read_csv()
с параметромlow_memory=False
помогает при чтении больших файлов. Я не думаю, что вы упомянули тип файла, который вы читаете, поэтому я не уверен, насколько это применимо к вашей ситуации.источник
Если ваш файл CSV, то вы можете просто сделать это в Chunk by Chunk. Вы можете просто сделать:
источник