2010-08-23 67 views
13

我需要以某种方式在磁盘上存储512^3阵列,而我目前使用HDF5。由于阵列稀疏,很多磁盘空间被浪费了。HDF5中的稀疏阵列支持

HDF5是否提供对稀疏数组的支持?

+0

[本答案] [1]提供了一个(仅限Python)解决方案。 [1]:http://stackoverflow.com/a/22589030/2858145 – 2014-03-23 13:55:32

回答

2

分块数据集(H5D_CHUNKED)允许贮疏但根据您的数据,开销可能是重要的。

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

+1

是的,[this](http://mail.hdfgroup.org/pipermail/hdf-forum_hdfgroup.org/2010-March/002704.html)后解释了如何做到这一点(或者怎么做_not_)谢谢 – andreabedini 2011-03-02 03:36:32

12

一种解决方法是用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)。


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

+0

尽管分析确实是在python中完成的,但是hdf5文件是用C++生成的,因此h5py不是一个选项。是由hdf5原生支持的相同种类的压缩吗?我知道pytables和h5py支持额外的压缩协议。 – andreabedini 2014-09-28 06:19:58

+1

@andreabedini我已经更新了答案,并链接到了一个C++示例,该示例使用相同的技术。我确信数据集必须被分块以启用压缩。 – 2014-09-28 20:58:06

+0

从答案开始时的[HDF5链接](http://docs.h5py.org/en/latest/high/dataset.html#chunked-storage):“分块存储可以调整数据集的大小,并且因为数据存储在固定大小的块中,所以要使用压缩过滤器。“所以,是的,压缩需要分块。 – hBy2Py 2015-07-06 17:48:18