用于LZF压缩数组的HDF5查看器

2 投票
2 回答
1873 浏览
提问于 2025-04-18 15:03

我正在使用h5py和LZF压缩来把NumPy数组存储在HDF5文件里。

这个方法效果很好,我压缩后的文件比未压缩的文件更容易携带。不过,当我试着用像vitablesHDFView这样的应用程序查看这些压缩文件时,却遇到了以下错误:

vitables中出现了“错误:读取记录时出现问题。数据集似乎是用None库压缩的。请检查它是否安装在你的系统中”,而在HDFView中则是“ncsa.hdf.hdf5lib.exceptions.HDF5Exception: ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException: 无法打开目录或文件”。

我可以在这两个应用程序中正常浏览文件结构,但打开数组时会出错。如果我关闭压缩,这个问题就消失了。举个例子,运行下面的代码后,打开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 个回答

7

我遇到了和你一样的问题,涉及到用LZF压缩存储的数据集,后来我找到了一篇相关的帖子。通过HDFView,我成功查看了用GZIP压缩、压缩等级为9的数据集,也就是:

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

不过,我还是想查看用LZF压缩的数据集。为了这个目的,有一个叫做HDF Compass的图形界面工具,可以用来处理HDF5文件(Github仓库),这个工具是由包括Andrew Collette在内的一些人开发的,他在HDF领域非常有名。当这个问题被提出来时,HDF Compass的开发刚刚开始。今天我测试了0.6.0版本,成功查看了一个LZF压缩的文件。

附注:要提醒一下,HDF Compass只是一个只读工具,不像HDFView那样可以编辑。不过,它非常友好,使用起来也很流畅。

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)

撰写回答