Как я могу оптимизировать файловый ввод / вывод в Python при обработке файлов размером в ГБ через NFS? - PullRequest
0 голосов
/ 29 января 2020

Из-за проблем с безопасностью я манипулирую несколькими файлами через nfs. Ситуация очень болезненная для обработки чего-либо из-за медленного файлового ввода-вывода. Ниже приведены описания проблемы.

  • Я использую pandas в Python для простой обработки данных. Поэтому я часто использую read_csv() и to_csv().
  • В настоящее время запись CSV-файла объемом 10 ГБ занимает около 30 минут, тогда как чтение занимает 2 минуты.
  • У меня достаточно процессорных ядер (> 20 ядер) и памяти (50G ~ 100G).
  • Трудно просить больше пропускной способности.
  • Мне часто нужен доступ к данным по столбцам. Например, было бы 100 миллионов записей с 20 столбцами (большинство из них - цифры c данные). Для данных я часто читаю все записи 100M только для значения 3 ~ 4 столбцов.
  • Я пробовал с HDF5, но он создает файл большего размера и требует столько же времени для записи. И это не обеспечивает ориентированный на столбцы ввод / вывод. Поэтому я отказался от этой опции.
  • Я не могу хранить их локально. Это нарушит многие критерии безопасности. На самом деле я работаю на виртуальной машине, а файловая система монтируется через nfs.
  • Я неоднократно читал несколько столбцов. Для нескольких столбцов нет. Задача что-то вроде анализа данных.

Какие подходы я могу рассмотреть? В некоторых случаях я использую sqlite3 для простой обработки данных и экспортирую результаты в файлы csv. Можно ли ускорить задачи ввода-вывода с помощью sqlite3 в Python? Я полагаю, что если бы это обеспечивало работу по столбцам, это было бы хорошим решением.

1 Ответ

0 голосов
/ 29 января 2020

два варианта: pandas hdf5 или dask.

  1. Вы можете просмотреть формат hdf5 с форматом = 'table'.

HDFStore поддерживает другие PyTables формат на диске, формат таблицы. Концептуально таблица очень похожа на DataFrame со строками и столбцами. Таблица может быть добавлена ​​в том же или других сеансах. Кроме того, операции удаления и типа запроса поддерживаются. Этот формат указывается с помощью format = 'table' или format = 't' для добавления или добавления или to_hdf.

Вы можете использовать dask read_csv. он считывает данные только тогда, когда execute ()

Для чистого улучшения производительности ввода-вывода, я думаю, лучше использовать hdf с форматом сжатия.

...