H5PY 键读取速度慢
Posted
技术标签:
【中文标题】H5PY 键读取速度慢【英文标题】:H5PY key reads slow 【发布时间】:2019-02-09 00:11:25 【问题描述】:我创建了一个包含 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 秒,然后性能就会下降到爬行状态。
【问题讨论】:
您指的是读取步骤慢,而不是写入步骤,对吧?而这 100 个步骤,是 1000 个keys0
步骤中的 100 个吗?当我尝试重新创建您的文件时,写入步骤有明显的延迟(几秒钟),但读取是瞬时的。
我不关心写入步骤。它很慢,但这是一次性的。阅读会发生很多事情。我猜你没有填充数据集?它的 imagenet,所以 140gb
【参考方案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 键读取速度慢的主要内容,如果未能解决你的问题,请参考以下文章