python - HDF5 比 CSV 占用更多空间?

标签 python pandas hdf5 pytables

考虑以下示例:

准备数据:

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)。

最佳答案

我的问题答案副本:https://github.com/pydata/pandas/issues/3651

您的样本确实太小了。 HDF5 具有相当大的开销,而且尺寸非常小(即使是 300k 条目也在较小的一侧)。以下是两边都没有压缩的情况。 float 实际上更有效地以二进制表示(即作为文本表示)。

此外,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 便宜,但你不能一次将所有东西都放在内存中,所以我们使用分 block 进行优化

关于python - HDF5 比 CSV 占用更多空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16639877/

相关文章:

python - 将逗号分隔字符串的 pandas DataFrame 列转换为单热编码

python - NumPy,运行时警告: invalid value encountered in power. How can I get see the value of my variables?

Python子包从相邻子包导入

python - 用 Python 复制 SAS 的第一个和最后一个功能

python - 如何处理偏移量超出可接受范围的时间戳字段

python - 用pytables压缩数组

python - 我可以使用 h5py 在一行中将字符串写入 HDF5 文件,而不是循环遍历条目吗?

hdf5 - 如何使用 gdal_translate 或 gdalwarp 将 HDF5 转换为 geotiff?

python - 如何让Python相信int类型实际上是hex类型?

python - 用python更改音频输出设备