插入许多 HDF5 数据集非常慢
Inserting Many HDF5 Datasets Very Slow
将许多数据集插入到一个组中时速度会急剧下降。
我发现减速点与名称的长度和数据集的数量成正比。较大的数据集确实需要更长的时间来插入,但它不会影响减速发生的时间。
下面的例子夸大了名字的长度只是为了说明问题,不用等很久。
- 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 数据集之后,它变得更慢。
为什么会这样?
有solution/remedy吗?
打开文件时尝试使用 libver='latest'。该库的最新版本大大提高了将项目添加到组中的速度,但出于兼容性原因,这只能通过上述选项启用。
将许多数据集插入到一个组中时速度会急剧下降。
我发现减速点与名称的长度和数据集的数量成正比。较大的数据集确实需要更长的时间来插入,但它不会影响减速发生的时间。
下面的例子夸大了名字的长度只是为了说明问题,不用等很久。
- 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 数据集之后,它变得更慢。
为什么会这样?
有solution/remedy吗?
打开文件时尝试使用 libver='latest'。该库的最新版本大大提高了将项目添加到组中的速度,但出于兼容性原因,这只能通过上述选项启用。