用于LZF压缩阵列的HDF5查看器

时间:2014-07-28 15:43:21

标签: python hdf5 h5py

我使用h5py with LZF compression在HDF5文件中存储NumPy数组。

效果很好,我的压缩文件比未压缩的文件便携得多。但是,如果我尝试使用vitablesHDFView等应用程序查看压缩文件,则会出现以下错误:

" 错误:读取记录时出现问题。数据集似乎使用None库进行压缩。检查它是否已安装在您的系统中,请"在 vitables

" ncsa.hdf.hdf5lib.exceptions.HDF5Exception:ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException:无法打开目录或文件"在 HDFView 中。

我可以在两个应用程序中浏览文件结构正常,但打开数组会产生错误。如果我关闭压缩,问题就会消失。例如,在运行下面的代码后,打开 array_1 会给我错误,但 array_2 不会。

import numpy as np, h5py

h5_path = r'D:\test.h5'

f = h5py.File(h5_path, 'w')

# Create fake data
data = (np.random.random(1E6)*100).astype(int)

# Save with compression
dset1 = f.create_dataset(r'/path/to/arrays/array_1', data=data, 
                         compression='lzf')

# Save without compression
dset2 = f.create_dataset(r'/path/to/arrays/array_2', data=data)

# Set some object properties
dset1.attrs['Description'] = 'Compressed array.'
dset2.attrs['Description'] = 'Uncompressed array.'

f.close()

预计会出现这种情况,还是我做错了什么?

如果vitables和HDFView无法打开压缩数组,是否有其他可以查看的查看器?

非常感谢!

2 个答案:

答案 0 :(得分:5)

我对使用LZF压缩存储的数据集有完全相同的问题,我最终找到了这篇文章。使用HDFView,我设法查看使用压缩级别为9的GZIP压缩的数据集,即:

dset = f.create_dataset('someData', data=data, compression="gzip", compression_opts=9)

但我仍然希望看到LZF压缩数据集。有一个名为HDF CompassGithub repo)的HDF5文件的GUI界面,由Andrew Collette开发,在HDF世界中众所周知。当问到这个问题时,HDF指南针的开发刚刚开始。今天我测试了0.6.0版,我设法正确查看了LZF压缩文件。

PD:只是警告,HDF Compass只是一个只读工具,与HDFView不同。但是,它仍然非常用户友好,非常活泼。

答案 1 :(得分:2)

虽然h5py附带LZF,但HDF5本身通常不会使用LZF进行分发或编译。 相反,您可以使用gzip,它包含在所有HDF5版本中,因此可以在任何系统上打开:

dset1 = f.create_dataset(r'/path/to/arrays/array_1', data=data, 
                         compression='gzip')

HDFView可以打开使用gzip压缩的数组。

此外,如果您使用gzip,则可以使用compression_opts来设置压缩级别(0到9之间的整数):

dset1 = f.create_dataset(r'/path/to/arrays/array_1', data=data, 
                         compression='gzip', compression_opts=9)