获取大量HDF5文件的组名

问题描述 投票:0回答:1

我有HDF5文件,其大小可能超过50 Gb。我只想获取一个顶级组中所有组的名称。例如,

f = h5py.File('my_file.hdf')
names = f['top_level_group'].keys()

有超过1,000,000个群组,运行上述代码需要几个小时才能完成。有什么办法可以在合理的时间内做到这一点?我觉得只需花几秒钟即可简单地获得所有组的名称。

python h5py
1个回答
0
投票

很奇怪。获取组名/密钥应该不需要花几个小时。除了访问群组外,您还在做什么吗?

这是一个非常简单的示例,它创建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) )
© www.soinside.com 2019 - 2024. All rights reserved.