加载速度与内存:如何有效地从h5文件加载大型阵列

2021-12-01 11:09:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直面临着以下问题:我必须循环num_objects = 897对象,对于每一个对象,我必须使用num_files = 2120h5文件。这些文件非常大,每个都是1.48 GB,我感兴趣的内容是每个文件中包含的3个大小为256 x 256 x 256的浮点数组(v1v2v3)。也就是说,循环看起来像:

for i in range(num_objects):
    ...
    for j in range(num_files):
       some operation with the three 256 x 256 x 256 arrays in each file

我当前加载它们的方法是在最内层的循环中执行以下操作:

f = h5py.File('output_'+str(q)+'.h5','r')
key1 = np.array(f['key1'])
v1=key1[:,:,:,0]
v2=key2[:,:,:,1]
v3=key3[:,:,:,2]

上述每次为每个对象加载文件的选项显然非常慢。另一方面,一次加载所有文件并将其导入字典会导致内存的过度使用,我的工作也会被终止。一些诊断:

  • 上述方法对于每个文件、每个对象需要0.48秒,因此仅此操作总共花费10.5天(!)
  • 我尝试将key1导出到npz文件,但实际上每个文件的速度慢了0.7秒
  • 我将每个文件的v1v2v3分别导出到npz文件(即每个h5文件3个npz文件),但这总共只为我节省了1.5天

是否有人有其他想法/建议我可以尝试快速,同时不受过度内存使用的限制