用于LZF压缩数组的HDF5查看器
我正在使用h5py和LZF压缩来把NumPy数组存储在HDF5文件里。
这个方法效果很好,我压缩后的文件比未压缩的文件更容易携带。不过,当我试着用像vitables和HDFView这样的应用程序查看这些压缩文件时,却遇到了以下错误:
在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 个回答
我遇到了和你一样的问题,涉及到用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那样可以编辑。不过,它非常友好,使用起来也很流畅。
虽然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)