HDF5 taking more space than CSV?
请考虑以下示例:
准备数据:
1 2 3 4 5 6 7 8 | 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可能的最高压缩:
1 2 3 | store = pd.HDFStore('myfile.h5',complevel=9, complib='bzip2') store['mydf'] = mydf store.close() |
另外还保存为CSV:
1 | mydf.to_csv('myfile.csv', sep=':') |
结果是:
-
myfile.csv 是5.6 MB大 -
myfile.h5 是11 MB大
随着数据集变大,差异越来越大。
我尝试过其他压缩方法和级别。 这是一个错误吗? (我正在使用Pandas 0.11和HDF5和Python的最新稳定版本)。
我的问题答案的副本:https://github.com/pydata/pandas/issues/3651
你的样本实在太小了。 HDF5具有相当大的开销,而且尺寸非常小(即使是较小的300k条目也是如此)。以下是任何一方都没有压缩。浮点数实际上更有效地用二进制表示(作为文本表示)。
此外,HDF5是基于行的。通过使表不是太宽但是相当长的表,你可以获得很高的效率。 (因此你的例子在HDF5中效率不高,在这种情况下将其存储转置)
我通常拥有10M +行的表,查询时间可以在ms中。即使是下面的例子也很小。拥有10 + GB文件是很常见的(更不用说10GB +几秒钟的天文学家!)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | -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很便宜,但你不能同时拥有内存中的所有内容所以我们通过使用分块进行优化