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

最新更新