что быстрее для загрузки: pickle или hdf5 в python

Учитывая список фреймов данных pandas размером 1,5 ГБ, какой формат является самым быстрым для загрузки сжатых данных: pickle (через cPickle), hdf5 или что-то еще в Python?

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

person denvar    schedule 20.06.2016    source источник
comment
Вы пробовали измерять это в ваших конкретных условиях?   -  person pvg    schedule 20.06.2016
comment
Я предполагаю, что pickle будет одним из худших способов сбросить эти данные :-). Конечно, это всего лишь предположение. У меня нет достоверных данных, подтверждающих это. Говоря о достоверных данных, почему бы не провести эксперимент и не выяснить?   -  person mgilson    schedule 20.06.2016
comment
Ну, я пишу вопрос, а не ответ, я думаю;) Я могу протестировать pickle vs hdf5, но что, если эксперт на этом сайте может указать мне гораздо лучший метод, который подпадает под действие или что-то еще? :)   -  person denvar    schedule 20.06.2016
comment
Вы можете проверить это сравнение...   -  person MaxU    schedule 20.06.2016
comment
вы можете профилировать это самостоятельно, и если вы фишинг для получения рекомендаций, как следует из вашего комментария, то это явно не по теме : Вопросы с просьбой порекомендовать или найти книги, инструменты, программные библиотеки, учебники или другие сторонние ресурсы не относятся к теме Stack Overflow, поскольку они, как правило, привлекают самоуверенные ответы и спам. Вместо этого опишите проблему и то, что уже было сделано для ее решения.   -  person    schedule 20.06.2016
comment
Об этом спрашивали раньше, и каждый раз консенсус в значительной степени зависит от ваших конкретных данных. Если бы один был полностью лучше другого, вы бы нашли ответ, прежде чем публиковать свой вопрос.   -  person Tadhg McDonald-Jensen    schedule 20.06.2016
comment
@ TadhgMcDonald-Jensen Если бы один был полностью лучше другого, вы бы нашли ответ, прежде чем публиковать свой вопрос. просто вообще странная логика.   -  person denvar    schedule 20.06.2016
comment
Я просто имел в виду, что если бы был окончательный ответ, он не был бы закрыт как не по теме, и вы бы нашли его на SO.   -  person Tadhg McDonald-Jensen    schedule 20.06.2016
comment
Это была панда версии 0.18.1? Все, пожалуйста, включите версию pandas no; сравнения производительности без версии no почти бесполезны для чего-то столь же быстро меняющегося, как pandas.   -  person smci    schedule 15.11.2019


Ответы (1)


Я бы рассмотрел только два формата хранения: HDF5 (PyTables) и Feather.

Вот результаты моего сравнения чтения и записи для DF (форма: 4000000 x 6, размер в памяти 183,1 МБ, размер несжатого CSV - 492 МБ).

Сравнение следующих форматов хранения: (CSV, CSV.gzip, Pickle, HDF5 [различное сжатие]):

                  read_s  write_s  size_ratio_to_CSV
storage
CSV               17.900    69.00              1.000
CSV.gzip          18.900   186.00              0.047
Pickle             0.173     1.77              0.374
HDF_fixed          0.196     2.03              0.435
HDF_tab            0.230     2.60              0.437
HDF_tab_zlib_c5    0.845     5.44              0.035
HDF_tab_zlib_c9    0.860     5.95              0.035
HDF_tab_bzip2_c5   2.500    36.50              0.011
HDF_tab_bzip2_c9   2.500    36.50              0.011

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

person MaxU    schedule 20.06.2016
comment
Почему вы рассматриваете только HDF5 и Feather, а не Pickle? Ваш результат показывает, что это неплохо, есть и спрессованный рассол. Разве это не хороший стандартный выбор? - person THN; 31.01.2018
comment
@THN, если я правильно помню, я видел некоторые ошибки в прошлом - хотя я не уверен, так ли это до сих пор ... - person MaxU; 01.02.2018
comment
проголосовал! что, если бы несколько пользователей должны были читать файл параллельно, тогда как запись выполнялась бы одним процессом - person PirateApp; 27.06.2018
comment
@PirateApp, несколько читателей не должны быть проблемой сами по себе (конечно, IO может пострадать). Я не знаю, что произойдет, если один или несколько читателей попытаются прочитать данные, которые записываются одновременно. Его следует тщательно протестировать. Я бы рассмотрел возможность использования одной из СУБД (Oracle, MySQL, PostgreSQL и т. д.) или Hive, Spark и т. д. для многопользовательских сред. - person MaxU; 27.06.2018
comment
проголосовал! спасибо, что поделились MaxU, причина, по которой я спрашивал, заключается в том, что у меня есть группы данных ohlc для каждого тикера, и я не хочу загружать все сразу в память, поскольку это занимает значительный объем, я хочу выполнить полное сканирование таблицы, повторяя каждую группу, было любопытно, подойдет ли hdf5 для этого по сравнению с sqlite или другими продуктами, мне это кажется немного странным, учитывая полное сканирование таблиц в sql, что, по моему мнению, идет вразрез с принципами дизайна rdbms, я думаю, но многопользовательское чтение является обязательным - person PirateApp; 27.06.2018
comment
@PirateApp, вы можете прочитать эту документацию - person MaxU; 27.06.2018
comment
@MaxU - это HDF5 для длительного хранения? Я понимаю, что обычные соленья - нет, но было бы здорово, если бы у самих панд было решение для долговременного хранения. - person Legit Stack; 07.07.2019
comment
@LegitStack, в настоящее время я бы использовал формат HDF5 или Parquet - оба они: 1) двоичный формат 2) поддерживают сжатие 3) долговременное хранение 4) очень быстро по сравнению с другими форматами - person MaxU; 07.07.2019
comment
@PirateApp пакет h5py описывает ваш вариант использования здесь; они называют его Single Writer Multiple Reader (SWMR). - person Kyle; 09.08.2019
comment
Чтение CSV-файла построчно выполняется намного быстрее, чем функция panda.read_csv(). Я могу прочитать 11000 строк менее чем за 0,15 секунды, но функция панды займет около 7 секунд для того же файла. Непонятно, почему панда находится в этом бенчмарке. - person LeanMan; 29.10.2020
comment
@LeanMan, ты читал исходный вопрос? Это все о пандах, поэтому я не понимаю вашего комментария... И еще - где вы храните данные, когда читаете их построчно и что вы делаете с этими данными потом? - person MaxU; 29.10.2020
comment
@MaxU, я читал ответ. Он использует Pandas.read_csv(). Размер файла 2 МБ, 11000 строк, 20 столбцов с плавающими точками данных, представленными в виде текста ascii, CSV. В каждом тестовом сценарии выбранный метод должен загрузить файл, а затем вычислить скользящее среднее и сравнить его с тестовыми данными, которые находятся в одном из столбцов. Так что, возможно, это не лучший тест, но он следует типичному сценарию для моего варианта использования, который заключается в загрузке файла, выполнении некоторой работы, проверке правильности выполненной работы. Выполнение файлового open() и чтения спама csv намного быстрее, чем эти другие решения. Я не знаю, что мне не хватает. - person LeanMan; 29.10.2020
comment
Это означает, что мне не хватает, чтобы заставить hd5 работать на меня. Да, и что касается CSV-файла, он хранится на диске и загружается построчно или по частям в зависимости от выбранного метода. Формат файла, то, как тест загружает файл и обрабатывает его, полностью основан на тестируемом методе. Сравнение яблок с яблоками выполняется в зависимости от того, достиг ли метод желаемого поведения, независимо от того, как я его реализовал. Надеюсь, ясно, что мое намерение состоит в том, чтобы проверить эти другие методы. - person LeanMan; 29.10.2020
comment
@LeanMan, нет смысла сравнивать чтение файлов CSV с использованием csv.reader() с pd.read_csv(), поскольку csv.reader дает вам список списков строк, которые необходимо сначала проанализировать для исправления типов данных, затем вам нужно создать Pandas DataFrame вне этого списка, и если вы будете измерять всю процедуру, которую вы выполняете вручную, я сомневаюсь, что ваш код будет быстрее по сравнению с pd.read_csv(). Поэтому, пожалуйста, сравните яблоки с яблоками! ;) - person MaxU; 29.10.2020
comment
Я думаю, что яблоки к яблокам - это не уровень реализации, а поведение. Если оба кода делают то, что я хочу, а один быстрее, я думаю, что сравнение уместно. - person LeanMan; 29.10.2020
comment
@LeanMan, тогда я действительно не понимаю, почему ты вообще опубликовал свой первый комментарий? Как это поможет ответить на первоначальный вопрос о Pandas DataFrame и как это поможет тем, кто зайдет на эту страницу из поисковых систем?? - person MaxU; 29.10.2020
comment
Потому что я один из тех, кто пытается понять вашу работу. Я имею в виду, что это комментарий, а не ответ на ОП. Мой комментарий - это вопрос, а не ответ. Мой вопрос заключается в том, что если hdf5 должен быть решением в отношении преимуществ доступа к хранилищу и вводу-выводу, то что я делаю неправильно с HDF5, чтобы выполнить простое построчное чтение CSV. Я имею в виду, что мы можем перенести это в чат, если это более уместно — как предлагает SO. - person LeanMan; 29.10.2020