我对该问题的回答副本:https ://github.com/pydata/pandas/issues/3651
你的样本真的太小了。HDF5 具有相当大的开销,而且尺寸非常小(即使是 300k 条目也在较小的一侧)。以下是两边都没有压缩的情况。浮点数实际上更有效地以二进制表示(即作为文本表示)。
此外,HDF5 是基于行的。通过拥有不太宽但相当长的表格,您可以获得很大的效率。(因此您的示例在 HDF5 中根本不是很有效,在这种情况下将其转置存储)
我通常有 10M+ 行的表,查询时间可以在毫秒内。即使是下面的例子也很小。拥有 10+GB 的文件是很常见的(更不用说 10GB+ 是几秒钟的天文家伙!)
-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 便宜,但你不能一次将所有东西都放在内存中,所以我们使用分块进行优化