【发布时间】:2015-10-10 18:09:38
【问题描述】:
我正在使用 NumPy 处理一些大型数据矩阵(大小约为 50GB)。我运行此代码的机器有 128GB 的 RAM,因此执行这种量级的简单线性运算在内存方面应该不是问题。
但是,当我在 Python 中计算以下代码时,我目睹了巨大的内存增长(超过 100GB):
import numpy as np
# memory allocations (everything works fine)
a = np.zeros((1192953, 192, 32), dtype='f8')
b = np.zeros((1192953, 192), dtype='f8')
c = np.zeros((192, 32), dtype='f8')
a[:] = b[:, :, np.newaxis] - c[np.newaxis, :, :] # memory explodes here
请注意,初始内存分配没有任何问题。但是,当我尝试通过广播执行减法运算时,内存增长到 100GB 以上。我一直认为广播会避免进行额外的内存分配,但现在我不确定是否总是这样。
因此,有人可以详细说明为什么会发生这种内存增长,以及如何使用更高效的内存结构重写以下代码?
我在 IPython Notebook 中运行 Python 2.7 中的代码。
【问题讨论】:
-
c是 created 的,形状为 (1, 192, 32),那么为什么要将其索引为c[np.newaxis, :, :]?这将创建一个形状为 (1, 1, 192, 32) 的视图。 -
感谢您的注意 - 这是我在修改代码以在 SO 中发布时出现的错字
标签: python python-2.7 numpy memory