python中的内存错误,大小为150 000的数组

时间:2017-07-28 11:52:26

标签: python numpy itertools

我试图获得2个不同numpy数组的每对元素之间的差异(大小:1 X 150000)。以下是我使用的代码:

#the input numpy array are a and b
c = a - b.reshape((-1,1))

#For an array say a=np.array([1,2,7,6]) and b=np.array([1,2,7,6])
# c = array([[ 0,  2,  6,  5],
   [-2,  0,  4,  3],
   [-6, -4,  0, -1],
   [-5, -3,  1,  0]])

我理解为什么使用此代码会导致内存错误。如何更新代码以便我不会收到错误?

我尝试使用itertools combinations_with_replacement,但仍然无法获得所需的结果。

1 个答案:

答案 0 :(得分:1)

您正在尝试创建150000 x 150000数组。我不确定你使用了哪种dtype但是在int32的情况下(每个数字4个字节)并且忽略了你试图分配的数组的开销:

>>> 150000 * 150000 * 4  # bytes
90000000000

转换为

>>> 150000 * 150000 * 4 / 1024 / 1024 / 1024  # Gigabytes
83.82

因此,如果您没有84GB的(免费)RAM,那么您将获得该操作的MemoryError。

使用itertools它会更糟,因为你需要一个列表,每个元素包含一个指针(在64位计算机上已经是8字节)并且取决于你的python版本和计算机每个整数需要~20-30字节:

>>> import sys
>>> sys.getsizeof(1)
28

基本上这会导致RAM要求:

>>> (28 + 8) * 150000 * 150000  # bytes
810000000000
>>> (28 + 8) * 150000 * 150000 / 1024 / 1024 / 1024  # Gigabytes
754.37

如果你有足够的硬盘存储,你可以尝试计算从一个阵列的每个点到另一个阵列中所有点的距离,然后将其保存到磁盘然后转到第一个阵列中的下一个点并计算到第二个数组中所有点的所有距离,依此类推。但是,根据存储值的方式(例如,如果以txt格式保存它们),可能会占用更大的内存。但这只是让你计算距离 - 你不能将所有的值都保存在RAM中。

MemoryError最直接的解决方案是购买更多内存(您可以根据上述数字计算出您需要多少内存)。如果这不是一个选项,您需要改变您的方法。