当前位置: 首页 > 面试题库 >

HDF5比CSV占用更多的空间?

聂昱
2023-03-14
问题内容

考虑以下示例:

准备数据:

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条目)。以下是两边都没有压缩的情况。浮点数实际上更有效地以二进制形式(以文本形式)表示。

此外,HDF5是基于行的。通过使表不是很宽但是很长,可以提高效率。(因此,您的示例在HDF5中根本不是很有效,请在这种情况下将其存储换位)

我通常有超过1000万行的表,查询时间可以是ms。甚至下面的例子也很小。拥有10GB以上的文件非常普遍(更不用说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便宜,但是您无法一次将所有内容都存储在内存中,因此我们通过分块进行优化



 类似资料:
  • 我试图导入多个CSV文件在一个特定的路径到数据集HDF5文件使用此代码: 但我有一个错误: 第15行,在帧=pd.concat(li,轴=0,ignore_index=True)文件/usr/本地/lib/python3.7/site-包/熊猫/核心/重塑/concat.py,第281行,在统一排序=排序,文件/usr/本地/lib/python3.7/site-包/熊猫/Core/reshape

  • 请帮助选择如何存储消息: 1) 2) SET似乎比LIST更容易使用,但Redis会在每条消息中存储字段名,从而使内存使用量增加一倍吗?

  • 只显示7-9个图像。 显示n个图像。 当我创建一个文件时,由于系统完全错误而导致写入错误。我试图创建符号链接。但是我不能搬动码头工人的东西。 删除/var/lib/docker/graph下的所有内容好吗?除了创建符号链接和扩展磁盘之外,还有什么其他可能性?我宁愿删除不必要的东西。

  • 问题内容: 我有一个100M的CSV文件(实际上是许多单独的CSV文件),总计84GB。我需要将其转换为具有单个float数据集的HDF5文件。我在测试中使用 h5py 时没有任何问题,但是现在我无法在没有内存不足的情况下完成最终数据集。 如何在不必将整个数据集存储在内存中的情况下写入HDF5?我期望这里有实际的代码,因为它应该很简单。 我只是在研究 pytables ,但看起来数组类(与HDF5

  • 问题内容: 我正在尝试计算这将占用多少空间(Mb)。在数据库表中,有7位列,2个微小的int和1个guid。 尝试计算将占用16000行的数量。 我的想法是,7位列占用1个字节,2个小整数占用2个字节,guid占用16个字节。表中的每一行总计19byte?那将意味着304000字节用于16000行,或者〜0.3mbs正确吗?是否还有元数据字节? 问题答案: 那里有几个估算器可以代替驴工作 您必须考

  • 我试图使用Primefaces的客户端验证(CSV)样本很长时间,以获得HTML5的足迹效果,但经过大量搜索和多次尝试,我无法获得预期的结果。我遵循了所有的文档,包括在< code>web.xml中输入必要的参数,验证本身工作正常,但是足迹效应不起作用。 在web.xml中添加了参数: 在我的文档顶部,我使用超文本标记语言5文档的符号: > 尝试使用 WildFly 8.2.1 和现在的 Wild