我创建了一个包含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秒才能全部运行,然后性能会下降到爬网状态。
答案 0 :(得分:0)
虽然我仍然不确定为什么它仍然很慢,但是我找到了一种解决方法:将每个子组合并为一个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