我有HDF5文件,其大小可能超过50 Gb。我只想获取一个顶级组中所有组的名称。例如,
f = h5py.File('my_file.hdf')
names = f['top_level_group'].keys()
有超过1,000,000个群组,运行上述代码需要几个小时才能完成。有什么办法可以在合理的时间内做到这一点?我觉得只需花几秒钟即可简单地获得所有组的名称。
很奇怪。获取组名/密钥应该不需要花几个小时。除了访问群组外,您还在做什么吗?
这是一个非常简单的示例,它创建1,000,000个组,关闭HDF5文件,然后重新打开以获取密钥。它可以在一分钟左右的时间在我的Windows笔记本电脑(24GB RAM)上运行。
with h5py.File('SO_59668177.h5','w') as h5f:
for g_cnt in range(1000000):
h5f.create_group('grp_' +str(g_cnt))
with h5py.File('SO_59668177.h5','r') as h5f:
names = h5f.keys()
print (len(names))
基于OP对数据集的评论,我修改了上面的代码以将数据集添加到每个组(加上一些定时输出)。然后,我进行了不同的组#(增加h5文件大小)。时序数据总结如下。请注意,对于50GB文件中的1,000,000个组,访问组/密钥的时间几乎不变(与0.5GB文件中的10,000个组相比)。但是,还有其他性能瓶颈(如名称长度计数所示)。
[10,000组(0.5GB)创建组和数据的时间= 4.13访问组的时间= 0.000831计算组时间= 0.0227
[100,000个组(5GB)创建组和数据的时间= 44.88访问组的时间= 0.000678组的计算时间= 0.266
[1,000,000组(50GB)创建组和数据的时间= 983.8访问组的时间= 0.00109计算组时间= 724.9
下面的修改代码。
size = 1000000
dim=80
arr=np.random.rand(dim*dim,1).reshape(dim,dim)
start = time.clock()
with h5py.File('SO_59668177.h5','w') as h5f:
for g_cnt in range(size):
grp=h5f.create_group('grp_' +str(g_cnt))
grp.create_dataset('dset_1',data=arr)
print ('create groups and data')
print ('Elapsed time =', (time.clock() - start) )
start = time.clock()
with h5py.File('SO_59668177.h5','r') as h5f:
names = h5f.keys()
print ('access groups')
print ('Elapsed time =', (time.clock() - start) )
start = time.clock()
print (len(names))
print ('count groups')
print ('Elapsed time =', (time.clock() - start) )