gpt4 book ai didi

python - 加载速度 vs 内存 : how to efficiently load large arrays from h5 file

转载 作者:行者123 更新时间:2023-12-04 09:03:46 31 4
gpt4 key购买 nike

我一直面临以下问题:我必须遍历 num_objects = 897对象,对于我必须使用的每一个对象 num_files = 2120 h5 文件。这些文件非常大,每个都是 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 秒。
  • 我导出了 v1 , v2v3单独将每个文件转换为 npz 文件(即每个 h5 文件有 3 个 npz 文件),但这总共只为我节省了 1.5 天。

  • 有没有人有其他想法/建议我可以尝试快速并且同时不受过多内存使用的限制?

    最佳答案

    如果我明白,你有 2120 个 .h5 文件。你只读取数据集f['key1']中的3个数组吗?每个文件? (或者是否有其他数据集?)如果您只/总是阅读 f['key1'] ,这是您无法编程的瓶颈。使用 SSD 会有所帮助(因为 I/O 比 HDD 快)。否则,您将不得不重新组织您的数据。您系统上的 RAM 量将决定您可以同时读取的数组数量。你有多少内存?
    您可能会通过小的代码更改获得一点速度。 v1=key1[:,:,:,0]以数组形式返回 v1(v2 和 v3 相同)。无需读取数据集 f['key1']成一个数组。这样做会使您的内存占用加倍。 (顺便说一句,是否有理由将您的数组转换为字典?)
    下面的过程仅通过切片 v1,v2,v3 创建了 3 个数组来自 h5py f['key1']目的。它会将每个循环的内存占用减少 50%。

    f = h5py.File('output_'+str(q)+'.h5','r')
    key1 = f['key1']
    ## key1 is returned as a h5py dataset OBJECT, not an array
    v1=key1[:,:,:,0]
    v2=key2[:,:,:,1]
    v3=key3[:,:,:,2]
    在 HDF5 方面,由于您总是切出最后一个轴,因此您的块参数可能会改善 I/O。但是,如果要更改块形状,则必须重新创建 .h5 文件。因此,这可能不会节省时间(至少在短期内)。

    关于python - 加载速度 vs 内存 : how to efficiently load large arrays from h5 file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63502513/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com