插入多个HDF5数据集非常缓慢

3

将许多数据集插入群组时,会出现显著的减速。

我发现减速点与名称长度和数据集数量成比例。较大的数据集确实需要更长时间来插入,但并不影响减速发生的时间。

以下示例夸大了名称的长度,只是为了说明这一点而不用等待很长时间。

  • Python 3
  • HDF5版本1.8.15(1.10.1甚至更慢)
  • h5py版本:2.6.0

示例:

import numpy as np
import h5py
import time

hdf = h5py.File('dummy.h5', driver='core', backing_store=False)
group = hdf.create_group('some_group')

dtype = np.dtype([
    ('name', 'a20'),
    ('x', 'f8'),
    ('y', 'f8'),
    ('count', 'u8'),
])
ds = np.array([('something', 123.4, 567.8, 20)], dtype=dtype)

long_name = 'abcdefghijklmnopqrstuvwxyz'*50

t = time.time()
size = 1000*25
for i in range(1, size + 1):
    group.create_dataset(
        long_name+str(i),
        (len(ds),),
        maxshape=(None,),
        chunks=True,
        compression='gzip',
        compression_opts=9,
        shuffle=True,
        fletcher32=True,
        dtype=dtype,
        data=ds
    )
    if i % 1000 == 0:
        dt = time.time() - t
        t = time.time()
        print('{0} / {1} -  Rate: {2:.1f} inserts per second'.format(i, size, 1000/dt))

hdf.close()

输出:

1000 / 25000 -  Rate: 1590.9 inserts per second
2000 / 25000 -  Rate: 1770.0 inserts per second
...
17000 / 25000 -  Rate: 1724.7 inserts per second
18000 / 25000 -  Rate: 106.3 inserts per second
19000 / 25000 -  Rate: 66.9 inserts per second
20000 / 25000 -  Rate: 66.9 inserts per second
21000 / 25000 -  Rate: 67.5 inserts per second
22000 / 25000 -  Rate: 68.4 inserts per second
23000 / 25000 -  Rate: 47.7 inserts per second
24000 / 25000 -  Rate: 42.0 inserts per second
25000 / 25000 -  Rate: 39.8 inserts per second

为了快速重现问题,我夸大了名称的长度。在我的问题中,名称的长度约为25个字符,在一个组中有约700k个数据集时出现减速点。在约1.4M个数据集后,它变得更慢。

为什么会发生这种情况?

是否有解决方案/补救措施?


1
除了John Readey的评论之外:这不是HDF5的预期用例,对于许多(比如数千个)数据集来说,很难获得良好的性能。请考虑将您的数据合并到较少的大型数据集中。 - Pierre de Buyl
问题在于我有一个特定的模式需要遵循,而且许多工具都依赖于该模式。某些条件正在生成比计划中更多的数据。 - Delicious
1个回答

2

当您打开文件时,请尝试使用libver='latest'。最近版本的库大大提高了向组中添加项目的速度,但出于兼容性原因,仅在使用上述选项时才启用此功能。


1
太棒了!libver='latest' 带来了很大的改变。我能够以恒定的速率插入500万个数据集,就像上面的例子一样。然而,那是“内存中”的情况,当我使用实际的数据写入磁盘时,它仍然会在大约100万个数据集后减慢约30倍。尽管它仍然会减慢,但比以前好多了。你有其他的建议吗? - Delicious

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接