H5PY键读取缓慢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了H5PY键读取缓慢相关的知识,希望对你有一定的参考价值。

我创建了一个包含1000个组的数据集,每个组都有1300个不同长度的uint8数组(尽管每个都有固定的大小)。键是~10个字符的字符串。我不想在保存时做任何棘手的事情(没有分块,压缩等 - 数据已经被压缩)。

第一次运行脚本时迭代所有键的速度非常慢,但第二次显着加速(相同的脚本,后面称为不同的进程),所以我怀疑某种方式存在一些缓存。经过一段时间的表演重置到可怕的水平,直到我再次等待它。

有没有办法存储数据来缓解这个问题?或者我能以某种方式阅读它吗?

简化的代码保存

with h5py.File('my_dataset.hdf5', 'w') as fp:
    for k0 in keys0:
        group = fp.create_group(k0)
        for k1, v1 in get_items(k0):
            group.create_dataset(k1, data=np.array(v1, dtype=np.uint8))

简化的密钥访问代码:

with h5py.File('my_dataset.hdf5', 'r') as fp:
    keys0 = fp.keys()
    for k0 in keys0:
        group = fp[k0]
        n += len(tuple(group.keys())

如果我在“慢速阶段”期间跟踪此脚本的进度,则每次迭代需要几乎一秒钟。但是,如果我在100步之后杀了它,那么下次我运行脚本时,前100个步骤需要<1秒来运行总计,然后性能会回落到爬行状态。

答案

虽然我仍然不确定为什么这仍然很慢,但我找到了一个解决方法:将每个子组合并为一个dataset

with h5py.File('my_dataset.hdf5', 'w') as fp:
    for k0 in keys0:
        subkeys = get_subkeys(k0)
        nk = len(subkeys)
        data = fp.create_dataset(
            'data', shape=(nk,),
             dtype=h5py.special_dtype(vlen=np.dtype(np.uint8)))
        keys = fp.create_dataset('keys', shape=(nk,), dtype='S32')
        for i, (k1, v1) in enumerate(get_items(k0)):
            keys[i] = k1
            data[i] = v1

以上是关于H5PY键读取缓慢的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 python 3 对 h5py 中的键进行切片而不形成列表?

使用 h5py 读取 matlab .mat 文件

h5py读取时间在读取速度上有随机且剧烈的波动

Pandas 无法读取使用 h5py 创建的 hdf5 文件

如何通过 h5py 读取 v7.3 mat 文件?

如何使用 h5py 读取只有数据集(无组)的 HDF5 文件?