Подтвердить что ты не робот

HDF5 занимает больше места, чем CSV?

Рассмотрим следующий пример:

Подготовьте данные:

import string
import random
import pandas as pd

matrix = np.random.random((100, 3000))
my_cols = [random.choice(string.ascii_uppercase) for x in range(matrix.shape[1])]
mydf = pd.DataFrame(matrix, columns=my_cols)
mydf['something'] = 'hello_world'

Установите максимальное сжатие для HDF5:

store = pd.HDFStore('myfile.h5',complevel=9, complib='bzip2')
store['mydf'] = mydf
store.close()

Сохранить также в CSV:

mydf.to_csv('myfile.csv', sep=':')

Результат:

  • myfile.csv имеет размер 5.6 МБ.
  • myfile.h5 имеет размер 11 МБ.

Разница возрастает по мере увеличения наборов данных.

Я попытался использовать другие методы и уровни сжатия. Это ошибка? (Я использую Pandas 0.11 и самую последнюю стабильную версию HDF5 и Python).

4b9b3361

Ответ 1

Скопируйте мой ответ из проблемы: https://github.com/pydata/pandas/issues/3651

Ваш образец действительно слишком мал. HDF5 имеет достаточное количество накладных расходов с действительно небольшими размерами (даже 300 тыс. Записей на меньшей стороне). Следующее - без сжатия с обеих сторон. Поплавки действительно более эффективно представлены в двоичном виде (это как текстовое представление).

Кроме того, HDF5 основан на строках. Вы получаете МНОГОэффективность за счет наличия таблиц, которые не слишком широки, но довольно длинные. (Следовательно, ваш пример не очень эффективен в HDF5 вообще, сохраните его в этом случае)

Я обычно имею таблицы, которые представляют собой строки 10M +, а время запроса может быть в ms. Даже приведенный ниже пример небольшой. Наличие 10 + ГБ файлов довольно распространено (не говоря уже о парнях с астрономией, у которых 10 ГБ + на несколько секунд!)

-rw-rw-r--  1 jreback users 203200986 May 19 20:58 test.csv
-rw-rw-r--  1 jreback users  88007312 May 19 20:59 test.h5

In [1]: df = DataFrame(randn(1000000,10))

In [9]: df
Out[9]: 
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1000000 entries, 0 to 999999
Data columns (total 10 columns):
0    1000000  non-null values
1    1000000  non-null values
2    1000000  non-null values
3    1000000  non-null values
4    1000000  non-null values
5    1000000  non-null values
6    1000000  non-null values
7    1000000  non-null values
8    1000000  non-null values
9    1000000  non-null values
dtypes: float64(10)

In [5]: %timeit df.to_csv('test.csv',mode='w')
1 loops, best of 3: 12.7 s per loop

In [6]: %timeit df.to_hdf('test.h5','df',mode='w')
1 loops, best of 3: 825 ms per loop

In [7]: %timeit pd.read_csv('test.csv',index_col=0)
1 loops, best of 3: 2.35 s per loop

In [8]: %timeit pd.read_hdf('test.h5','df')
10 loops, best of 3: 38 ms per loop

Я действительно не стал бы беспокоиться о размере (я подозреваю, что вы этого не делаете, но просто заинтересован, и это хорошо). Точка HDF5 заключается в том, что диск дешевый, процессор дешевый, но вы не можете иметь все в памяти сразу, поэтому мы оптимизируем, используя chunking