web-dev-qa-db-ja.com

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 MB大きい
  • myfile.h5は11 MB大きい

データセットが大きくなると、その差は大きくなります。

他の圧縮方法とレベルを試しました。これはバグですか? (私はPandas 0.11と最新の安定したバージョンのHDF5とPythonを使用しています)。

31

問題からの私の回答のコピー: https://github.com/pydata/pandas/issues/3651

あなたのサンプルは本当に小さすぎます。 HDF5には、かなり小さいサイズのオーバーヘッドがかなりあります(300kのエントリでも小さい方です)。次は、どちらの側にも圧縮がない場合です。フロートはバイナリで(テキスト表現として)より効率的に表現されます。

さらに、HDF5は行ベースです。幅は広すぎないがかなり長いテーブルを用意することで、効率が大幅に向上します。 (したがって、あなたの例はHDF5ではまったく効率的ではありません。この場合は転置して保存してください)

私は日常的に1,000万行以上のテーブルを使用しており、クエリ時間はミリ秒単位にすることができます。以下の例でも小さいです。 10 GB以上のファイルを持つことは非常に一般的です(10 GB以上が数秒である天文学者は言うまでもありません!)

-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のポイントは、ディスクは安価で、CPUは安価ですが、すべてを一度にメモリに格納することはできないため、チャンキングを使用して最適化します。

39
Jeff