HDF5 zajmuje więcej miejsca niż CSV?

Rozważ następujący przykład:

Przygotuj DANE:

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'

Ustaw najwyższą możliwą kompresję dla HDF5:

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

Zapisz również do CSV:

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

Wynik jest następujący:

  • myfile.csv to 5.6 MB big
  • myfile.h5 to 11 MB

Różnica rośnie wraz ze wzrostem zbiorów danych.

Próbowałem z innymi metodami kompresji i poziomami. Czy to robak? (Używam Pandy 0.11 i najnowszej stabilnej wersji HDF5 i Python).

Author: Amelio Vazquez-Reina, 2013-05-20

1 answers

Kopia mojej odpowiedzi z numeru: https://github.com/pydata/pandas/issues/3651

Twoja próbka jest naprawdę za mała. HDF5 ma spore obciążenie przy naprawdę małych rozmiarach (nawet 300K wpisów jest po mniejszej stronie). Poniżej znajduje się bez kompresji po obu stronach. Pływaki są naprawdę wydajniej reprezentowane w postaci binarnej (czyli jako reprezentacja tekstowa).

Ponadto HDF5 jest oparty na wierszach. Uzyskujesz dużą wydajność, mając stoły, które nie są zbyt szerokie, ale są dość długie. (Stąd twój przykład nie jest zbyt wydajny w HDF5 w ogóle, przechowuj go w tym przypadku)

Rutynowo mam tabele, które mają 10M + wierszy i czasy zapytań mogą być w ms. nawet poniższy przykład jest mały. Posiadanie plików 10 + GB jest dość powszechne (nie wspominając o astronomach, którzy 10GB+ to kilka sekund!)

-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

Naprawdę nie martwiłbym się rozmiarem (podejrzewam, że nie jesteś, ale jesteś tylko zainteresowany, co jest w porządku). Sens HDF5 jest taki, że dysk jest tani, procesor jest tani, ale nie możesz mieć wszystkiego w pamięci na raz, więc optymalizujemy za pomocą chunking

 34
Author: Jeff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-20 01:37:27