【问题标题】:HDF5 taking more space than CSV?HDF5 比 CSV 占用更多空间?
【发布时间】:2013-05-14 10:36:21
【问题描述】:

考虑以下示例:

准备数据:

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

【问题讨论】:

  • afaik HDF5 旨在优化查找时间.. 不是文件大小
  • 字符串列也使用了每列的固定大小(即所有列的最大大小)。在文档中阅读有关 min_itemsize 的信息
  • 请参阅此参考以获取我的上述评论:pandas.pydata.org/pandas-docs/dev/io.html#string-columns。此外。您的测试只是在 HDF5 中显示了一些开销。这是非常结构化的数据;用 1M 行浮点数尝试同样的事情,你会感到惊讶。
  • 非常感谢@Jeff。我仍然不同意这一点。我创建的矩阵有 100 x 3000= 300,000 float64 值和只有 100 个字符串,并且它们都具有相同的值,我认为这应该从压缩中受益。尽管如此,它仍然比 CSV 文件占用 更多 空间,即使我使用了可能的最高压缩方案。这是预期的吗?
  • @user815423426 我的经历和你的一样 - hdf5 比 csv 占用更多的空间。

标签: python pandas hdf5 pytables


【解决方案1】:

我对这个问题的回答的副本: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 便宜,但你不能一次将所有东西都放在内存中,所以我们使用分块进行优化

【讨论】:

    猜你喜欢
    • 2016-10-29
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多