首页 > 解决方案 > 如何在使用 h5py 的基本数学运算上不使用所有内存?

问题描述

我有 2 个使用 h5py 存储的大型数组。我想做一些基本的 numpy 操作,如加法、减法等。最优雅的方法是什么?

f = h5py.File('x', 'w')

d1 = f.create_dataset('1', (100000, 10000), 'i')
d2 = f.create_dataset('2', (100000, 10000), 'i')

d2[:] = 1

np.add(d2, d2, out=d1)

np.add() 的输出参数有问题,因为它不是 ArrayType。我假设我需要通过自己加载整个文件来实现添加功能,所以不要“吃掉”所有的内存,对吧?像这样的东西:

for block_index in range(d2.shape[0]):
    d1[block_index:] = d2[block_index:] + d2[block_index:]

或者有没有更好的解决方案?

谢谢

标签: pythonnumpymemory-managementh5py

解决方案


你是对的; d1并且d2是 h5py 数据集对象,而不是 numpy ndarrays。您需要添加 [:] 以从数据集中获取 ndarray。

我修改了上面的示例以创建数据集12(每个都填充了常量值),然后将它们添加为 ndarray. 结果是一个新的 ndarray( d3_arr),然后将其保存到新的数据集3

示例 1:

import h5py, numpy as np

with h5py.File('SO_57868593.h5', 'w') as h5f :

    d1 = h5f.create_dataset('1', (10, 10), 'i')
    d2 = h5f.create_dataset('2', (10, 10), 'i')

    d1[:] = 1
    d2[:] = 2
    d3_arr = np.ndarray( (10, 10), 'i' )
    np.add(d1[:], d2[:], out=d3_arr)    
    d3 = h5f.create_dataset('3', data=d3_arr)
    print ('done')

示例2:
在该方法中,首先创建数据集3(空/无数据),d3_arr 是一个单行的ndarray。for 循环遍历 d1 和 d2 的行,将它们相加得到 d3_arr,然后将 d3_arr 复制到数据集 3 中的匹配行中。

# replace/reorder code below as shown
#   d3_arr = np.ndarray( (10, 10), 'i' )
#   np.add(d1[:], d2[:], out=d3_arr)
#   d3 = h5f.create_dataset('3', data=d3_arr)

    d3 = h5f.create_dataset('3', (10, 10), 'i')
    d3_arr = np.ndarray( (1, 10), 'i' )
    for row in range(d1.shape[0]) :
        np.add(d1[row,:], d2[row,:], out=d3_arr)
        d3[row,:] = d3_arr

推荐阅读