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 键读取速度慢的主要内容,如果未能解决你的问题,请参考以下文章

我的电脑速度超慢!!求救!!!

xss下载到外接硬盘下载速度慢

xss下载到外接硬盘下载速度慢

GATT特性BLE读取速度慢

性能:Android JCIFS 文件读取速度慢

哈希键列的隐式转换导致插入速度非常慢