Привет! 🙋

В настоящее время данные играют очень важную роль в анализе и построении модели машинного обучения и искусственного интеллекта. Данные можно найти в различных форматах CSV, плоских файлов, JSON и т. Д., Что, когда они огромны, затрудняет чтение в память. Этот блог посвящен обработке табличных данных в формате CSV, которые представляют собой файлы, разделенные запятыми.

Проблема: импорт (чтение) большого CSV-файла приводит к ошибке "Недостаточно памяти". Недостаточно оперативной памяти для одновременного чтения всего CSV приводит к сбою компьютера.

Вот несколько эффективных способов импорта CSV в Python.

Что теперь? Что ж, давайте подготовим набор данных, который должен быть огромным по размеру, а затем сравним производительность (время) при реализации параметров, показанных на рисунке 1.
Начнем ...

Создайте фрейм данных из 15 столбцов и 10 миллионов строк со случайными числами и строками. Экспортируйте его в формат CSV размером около 1 ГБ.

df = pd.DataFrame(data=np.random.randint(99999, 99999999, size=(10000000,14)),columns=['C1','C2','C3','C4','C5','C6','C7','C8','C9','C10','C11','C12','C13','C14'])
df['C15'] = pd.util.testing.rands_array(5,10000000)
df.to_csv("huge_data.csv")

Давайте теперь рассмотрим варианты импорта и сравним время, затраченное на чтение CSV в память.

ПАНДЫ

Библиотека python pandas предоставляет функцию read_csv () для импорта CSV в качестве структуры фрейма данных для легкого вычисления или анализа. Эта функция предоставляет один параметр, описанный в следующем разделе, чтобы импортировать ваш гигантский файл намного быстрее.

1. pandas.read_csv ()

Вход: чтение файла CSV.
Вывод: фрейм данных pandas

pandas.read_csv () загружает весь файл CSV сразу в память в одном кадре данных.

start = time.time()
df = pd.read_csv('huge_data.csv')
end = time.time()
print("Read csv without chunks: ",(end-start),"sec")
Read csv without chunks:  26.88872528076172 sec

Иногда это может привести к сбою вашей системы из-за ошибки OOM (Out Of Memory), если размер CSV превышает размер вашей памяти (RAM). Решение улучшено следующим способом импорта.

2. pandas.read_csv (размер фрагмента)

Вход: чтение файла CSV.
Вывод: фрейм данных pandas

Вместо того, чтобы читать весь CSV сразу, фрагменты CSV считываются в память. Размер чанка указывается с помощью параметра chunksize, который относится к количеству строк. Эта функция возвращает итератор для итерации по этим фрагментам, а затем по желанию обрабатывает их. Поскольку за один раз читается только часть большого файла, нехватки памяти достаточно для размещения данных. Позже эти фрагменты можно объединить в один фрейм данных.

start = time.time()
#read data in chunks of 1 million rows at a time
chunk = pd.read_csv('huge_data.csv',chunksize=1000000)
end = time.time()
print("Read csv with chunks: ",(end-start),"sec")
pd_df = pd.concat(chunk)
Read csv with chunks:  0.013001203536987305 sec

Этот вариант работает быстрее, и его лучше всего использовать, когда у вас ограниченная оперативная память. В качестве альтернативы также можно использовать новую библиотеку Python DASK, описанную ниже.

DASK

Вход: чтение файла CSV.
Вывод: фрейм данных Dask

При чтении больших CSV-файлов вы можете столкнуться с ошибкой нехватки памяти, если она не умещается в вашей оперативной памяти, поэтому DASK вступает в игру.

  • Dask - это библиотека Python с открытым исходным кодом с функциями параллелизма и масштабируемости в Python, включенная по умолчанию в дистрибутив Anaconda.
  • Он расширяет свои возможности за счет масштабируемости и параллелизма за счет повторного использования существующих библиотек Python, таких как pandas, numpy или sklearn. Это удобно для тех, кто уже знаком с этими библиотеками Python.
  • С чего начать? Вы можете установить через pip или conda. Я бы порекомендовал conda, потому что установка через pip может вызвать некоторые проблемы.
pip install dask

Что ж, когда я попробовал описанное выше, возникла проблема, которая была решена с помощью ссылки на GitHub для внешнего добавления пути к dask в качестве переменной среды. Но зачем суетиться, когда есть вариант попроще?

conda install dask
  • Реализация кода:
from dask import dataframe as dd
start = time.time()
dask_df = dd.read_csv('huge_data.csv')
end = time.time()
print("Read csv with dask: ",(end-start),"sec")
Read csv with dask:  0.07900428771972656 sec

Dask, кажется, быстрее всех читает этот большой CSV-файл без сбоев и замедления работы компьютера. Ух ты! Насколько это хорошо? !! Новая библиотека Python с измененными существующими для обеспечения масштабируемости.

Почему DASK лучше PANDAS?

  • Pandas использует одно ядро ​​ЦП, в то время как Dask использует несколько ядер ЦП, параллельно разделяя фрейм данных и процесс. Проще говоря, несколько небольших фреймов данных большого фрейма данных обрабатывались одновременно, в то время как под пандами работа с одним большим фреймом данных занимает много времени.
  • DASK может обрабатывать большие наборы данных на одном процессоре, используя его несколько ядер, или кластер машин относится к распределенным вычислениям. Он предоставляет своего рода масштабированные библиотеки pandas и numpy.
  • Не только dataframe, dask также предоставляет библиотеки массивов и scikit-learn для использования параллелизма.

Некоторые из предоставленных DASK библиотек показаны ниже.

  • Массивы Dask: параллельный Numpy
  • Фреймы данных Dask: параллельные панды
  • Dask ML: параллельный Scikit-Learn

Мы сосредоточимся только на Dataframe, поскольку два других выходят за рамки. Но, чтобы запачкать руки, лучше всего рассмотреть этот блог.

Как Dask удается хранить данные, размер которых превышает объем памяти (ОЗУ)?

Когда мы импортируем данные, они считываются в нашу оперативную память, что подчеркивает ограничение памяти.
Допустим, вы хотите импортировать 6 ГБ данных в 4 ГБ ОЗУ. Этого нельзя достичь с помощью pandas, поскольку все данные в одном кадре не помещаются в память, а Dask может. Как?
Dask вместо того, чтобы сначала вычислять, создайте график задач, который говорит о том, как выполнить эту задачу. Он верит в ленивые вычисления, что означает, что планировщик задач dask сначала создает график, а затем вычисляет этот график по запросу. Для выполнения любых вычислений явно вызывается compute (), который вызывает планировщик задач для обработки данных с использованием всех ядер и, наконец, объединяет результаты в один.

Это не составит труда разобраться тем, кто уже знаком с пандами.

Не могу сдержать мое любопытство к обучению, так рада опубликовать Dask для Python и машинного обучения с более глубоким изучением.

Заключение

Чтение ~ 1 ГБ CSV в памяти с различными параметрами импорта можно оценить по времени, затраченному на загрузку в память.

pandas.read_csv является худшим при чтении CSV большего размера, чем RAM.
pandas.read_csv (chunksize) работает лучше, чем указано выше, и его можно улучшить, изменив размер chunksize.
dask.dataframe оказался самым быстрым, поскольку он имеет дело с параллельной обработкой.

Следовательно, я бы рекомендовал выйти из зоны комфорта использования панд и попробовать dask. Но, к вашему сведению, я тестировал DASK только для чтения большого CSV, но не для вычислений, как мы делаем в pandas.

Вы можете проверить мой код github, чтобы получить доступ к записной книжке, посвященной кодированию в этом блоге.

использованная литература



3. Чтобы запачкать руки в DASK, следует просмотреть ссылку ниже.



Не стесняйтесь подписаться на этого автора, если вам понравился блог, потому что этот автор заверяет, что снова вернется с более интересными материалами, связанными с ML / AI.
Спасибо,
Удачного обучения! 😄

Можно связаться через LinkedIn.