Numpy memmap在进行向量操作时仍然使用RAM而非磁盘
我初始化了两个操作数和一个结果:
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)