2014-02-17 6 views
3

Я новичок в pytables и задал вопрос о хранении сжатых pandas DataFrame. Мой текущий код:Сжатие данных с HDFStore

import pandas 
# HDF5 file name 
H5name="C:\\MyDir\\MyHDF.h5" 

# create HDF5 file 
store=pandas.io.pytables.HDFStore(H5name) 

# write a pandas DataFrame to the HDF5 file created 
myDF.to_hdf(H5name,"myDFname",append=True) 

# read the pandas DataFrame back from the HDF5 file created 
myDF1=pandas.io.pytables.read_hdf(H5name,"myDFname") 

# close the file 
store.close() 

Когда я проверил размер hdf5 создан, размер (212kb) был гораздо больше, чем оригинальный файл CSV (58Kb) я использовал для создания панд DataFrame.

Итак, я попробовал сжатие путем (удаление файла hdf5) и воссоздавать

# create HDF5 file 
store=pandas.io.pytables.HDFStore(H5name,complevel=1) 

и размер созданного файла не изменится. Я пробовал все complevels от 1 до 9, и размер остался прежним.

Я пытался добавить

# create HDF5 file 
store=pandas.io.pytables.HDFStore(H5name,complevel=1,complib="zlib") 

, но у него не было никаких изменений в сжатии.

В чем может быть проблема?

Кроме того, в идеале я хотел бы использовать сжатие, подобное тому, что делает R для его функции сохранения (например, в моем случае файл 58kb был сохранен в размере 27 КБ в RData)? Нужно ли делать какую-либо дополнительную сериализацию в Python, чтобы уменьшить размер?

EDIT:

Я использую Python 3.3.3 и панда 0.13.1

EDIT: Я попытался с большим файла 487MB CSV-файлом, чей RDATA size (через R Сохранит функция) - 169 МБ. Для больших файлов я вижу сжатие. Bzip2 дал лучшее сжатие 202 МБ (уровень = 9) и был самым медленным для чтения/записи. Сжатие Blosc (уровень = 9) дало наибольший размер 276 МБ, но было намного быстрее писать/читать.

Не уверен, что R делает по-другому в своей функции save, но он одинаково быстрый и гораздо более сжатый, чем любой из этих компрессионных альго.

+0

вам также нужно указать '' complib''. см. документы здесь: http://pandas-docs.github.io/pandas-docs-travis/io.html#compression – Jeff

+0

Скопировать и вставить проблему? Вы не передаете 'store' функции' to_hdf'. Поэтому любые параметры, переданные конструктору HDFStore, не имеют эффекта. Проще всего передать параметры complib и completevel в 'to_hdf' и не создавать объект HDFStore явно. –

ответ

2

У вас здесь действительно крошечный файл. HDF5 в основном разбивает ваши данные; обычно 64 КБ - это минимальный размер куска. Из-за того, что такое данные, он может даже не сжиматься с такими размерами.

Вы можете попробовать msgpack для простого soln для данных этого размера. HDF5 достаточно эффективен для больших размеров и сжимается довольно хорошо.

Смежные вопросы