Numpy memmap在进行向量操作时仍然使用RAM而非磁盘

0 投票
1 回答
46 浏览
提问于 2025-04-12 22:47

我初始化了两个操作数和一个结果:

a = np.memmap('a.mem', mode='w+', dtype=np.int64, shape=(2*1024*1024*1024))
b = np.memmap('b.mem', mode='w+', dtype=np.int64, shape=(2*1024*1024*1024))
result = np.memmap('result.mem', mode='w+', dtype=np.int64, shape=(2*1024*1024*1024))

在这种空闲状态下,Google Colab报告的系统内存显示为1.0/12.7 GB,这很好,因为还没有内存活动。但是,当进行像向量减法这样的向量操作时,报告的系统内存几乎达到了最大值,显示为11.2/12.7 GB,最终导致运行时内核崩溃:

result[:] = a[:] - b[:] # This still consume memory
result.flush()

我已经多次阅读np.memmap的文档,里面说memmap的目的是为了减少内存消耗,但为什么我还是遇到了内存不足的错误呢?

我怀疑,向量减法必须分成小块进行缓冲,比如每次512MB的缓冲内存。但我不知道具体的语法是什么:也许我想表达的意思是这样的:

BUFF_SIZE = 512 * 1024 * 1024
for i in range(0, result.size, BUFF_SIZE):
  result[i:i+BUFF_SIZE] = a[i:i+BUFF_SIZE] - b[i:i+BUFF_SIZE]
  result.flush()

1 个回答

2

result[:] = a[:] - b[:] 这段代码并不是说“直接把减法的结果写进 result”。它的意思是“先把减法的结果放到一个新的数组里,然后再把这个数组的内容复制到 result”。这样做会在中间创建一个16 GiB的临时数组。

如果想要直接把结果写进 result,可以使用 numpy.subtract 函数的 out 参数:

numpy.subtract(a, b, out=c)

撰写回答