HDF5 中的稀疏数组支持

Posted

技术标签:

【中文标题】HDF5 中的稀疏数组支持【英文标题】:Sparse array support in HDF5 【发布时间】:2011-04-02 12:01:28 【问题描述】:

我需要以某种方式在磁盘上存储一个 512^3 数组,我目前正在使用 HDF5。由于阵列稀疏,因此浪费了大量磁盘空间。

HDF5 是否支持稀疏数组?

【问题讨论】:

[这个答案][1] 提供了一个(仅限 Python)解决方案。 [1]:***.com/a/22589030/2858145 【参考方案1】:

一种解决方法是使用compression option 创建数据集。例如,在 Python 中使用h5py:

import h5py
f = h5py.File('my.h5', 'w')
d = f.create_dataset('a', dtype='f', shape=(512, 512, 512), fillvalue=-999.,
                     compression='gzip', compression_opts=9)
d[3, 4, 5] = 6
f.close()

生成的文件为 4.5 KB。如果没有压缩,这个相同的文件大约为 512 MB。这是 99.999% 的压缩率,因为大部分数据都是 -999.(或您想要的任何 fillvalue)。


可以使用 C++ HDF5 API 通过将 H5::DSetCreatPropList::setDeflate 设置为 9 和 example shown in h5group.cpp 来实现等效。

【讨论】:

虽然分析确实是用python完成的,但是hdf5文件是用C++生成的,所以h5py不是一个选项。 hdf5 本身是否支持相同类型的压缩?我知道 pytables 和 h5py 支持额外的压缩协议。 @andreabedini 我已经更新了答案,提供了一个指向执行相同技术的 C++ 示例的链接。我确实认为必须对数据集进行分块才能启用压缩。 来自答案开头的HDF5 link:“分块存储可以调整数据集的大小,并且由于数据存储在固定大小的块中,因此可以使用压缩过滤器。”所以,是的,压缩需要分块。 上述代码中compression_opts做了什么? @Rama 9 是最大压缩级别;见the docs【参考方案2】:

分块数据集 (H5D_CHUNKED) 允许稀疏存储,但根据您的数据,开销可能很重要。

取一个典型的数组,尝试稀疏和非稀疏,然后比较文件大小,然后你会看到它是否真的值得。

【讨论】:

是的,this 帖子解释了如何做到这一点(或者也许如何做到这一点)谢谢【参考方案3】:

HDF5 提供索引存储:http://www.hdfgroup.org/HDF5/doc/TechNotes/RawDStorage.html

【讨论】:

嗨,我不太熟悉 hdf5 内部的工作原理,如何将原始数据存储在 hdf5 文件中?这是否意味着我可以绕过 Table 数据类型并编写自己的结构?

以上是关于HDF5 中的稀疏数组支持的主要内容,如果未能解决你的问题,请参考以下文章

数组和稀疏矩阵

理解JS里的稀疏数组与密集数组

稀疏数组

Python中的稀疏3d矩阵/数组?

C++中的稀疏数组

在 Mathematica 中的稀疏数组上有效替代 Outer?