循环中的python numpy数组内存错误

循环中的python numpy数组内存错误,python,arrays,numpy,large-data,Python,Arrays,Numpy,Large Data,在使用大型numpy阵列时,我遇到了一个非常奇怪的问题。这是基本的背景。我有大约15个成对对象的列表,我正在为它们构造邻接矩阵。每个邻接矩阵约为4000 x 4000(正方形矩阵,其中对角线表示对象与其自身配对),因此它很大,但不太大。以下是我的代码的基本设置: def createAdjacencyMatrix(pairedObjectList, objectIndexList): N = len(objectIndexList) adj = numpy.zeros((N,N))

在使用大型numpy阵列时,我遇到了一个非常奇怪的问题。这是基本的背景。我有大约15个成对对象的列表,我正在为它们构造邻接矩阵。每个邻接矩阵约为4000 x 4000(正方形矩阵,其中对角线表示对象与其自身配对),因此它很大,但不太大。以下是我的代码的基本设置:

def createAdjacencyMatrix(pairedObjectList, objectIndexList):
   N = len(objectIndexList)
   adj = numpy.zeros((N,N))
   for i in range(0, len(pairedObjectList):
      #put a 1 in the correct row/column position for the pair etc.

   return adj
在我的脚本中,我调用这个函数大约15次,每对对象列表调用一次。但是,每次运行时都会出现以下错误:

    adj = np.zeros((N,N))
MemoryError
我真的不明白内存错误是从哪里来的。尽管我正在制作这个大矩阵,但它只存在于该函数的范围内,所以它不应该在每次函数完成时从内存中清除吗?更不用说,如果同一个变量在内存中挂起,那么它不应该覆盖这些内存位置吗

非常感谢理解这一点的任何帮助

编辑:这是回溯的完整输出

Traceback (most recent call last):
  File "create_biogrid_adjacencies.py", line 119, in <module>
    adjMat = dsu.createAdjacencyMatrix(proteinList,idxRefDict)
  File "E:\Matt\Documents\Research\NU\networks_project\data_setup_utils.py", line 18, in createAdjacencyMatrix
    adj = np.zeros((N,N))
MemoryError
回溯(最近一次呼叫最后一次):
文件“create_biogrid_adjacencies.py”,第119行,中
adjMat=dsu.createAdjacencyMatrix(proteinList,idxRefDict)
文件“E:\Matt\Documents\Research\NU\networks\u project\data\u setup\u utils.py”,第18行,在createAdjacencyMatrix中
adj=np.零((N,N))
记忆者

为什么说它只存在于该函数的作用域中,而实际上您返回了adj?或者“该函数”指的不是
createAdjacencyMatrix
?您可以上传完整的回溯,以便更好地解决问题。如果
adj
中的值总是0或1,您可以使用
adj=numpy.zeros((N,N),dtype=numpy.uint8)来节省一些内存。然后每个元素使用1个字节而不是8个。@WarrenWeckesser我考虑过这一点,它可能适用于这种情况,但我正在试图找出潜在的机制。即使我返回它,它也只是脚本中for循环中的一个变量,然后在下一个变量出现之前保存到文件中。另外,为什么内存错误来自该行,而不是脚本中的变量溢出loop@Matt您可能希望在您正在谈论的外部for循环中放入一条print语句。知道你的程序在迭代多少次后遇到内存错误是很有用的——直接使用15个矩阵中的第一个矩阵,或者更进一步。此外,每个对象是否属于唯一的一对?或者它可以是许多对的一部分?如果是前者,那么邻接矩阵的空间效率非常低。您正在使用O(N^2)数量的空间,而不仅仅是O(N)数量。