占用太多内存 - 蟒蛇

时间:2013-07-12 15:40:11

标签: python memory numpy yield

我写了一个递归函数,穷尽地生成了某些特征的矩阵。 功能如下:

def heavies(rowSums,colSums,colIndex,matH):
    if colIndex == len(colSums) - 1:
        for stuff in heavy_col_permutations(rowSums,colSums,colIndex):
            matH[:,colIndex] = stuff[0]
            yield matH.copy()
        return

    for stuff in heavy_col_permutations(rowSums,colSums,colIndex):
        matH[:,colIndex] = stuff[0]
        rowSums = stuff[1]

        for matrix in heavies(rowSums,colSums,colIndex+1,matH):
            yield matrix

和heavy_col_permutations是一个函数,它只返回一个具有我需要的特征的矩阵列。

问题在于,当重量级产生大量矩阵时,它会占用太多内存。 我最终逐个从另一个函数调用它,最终我占用了太多RAM并且我的进程被杀死了(我在带有内存上限的服务器上运行它)。如何编写它以减少内存使用?

程序看起来像:

r = int(argv[1])
n = int(argv[2])
m = numpy.zeros((r,r),numpy.dtype=int32)
for row,col in heavy_listing(r,n):
    for matrix in heavies(row,col,0,m):
        # do more stuff with matrix

我知道重量函数是大量内存吸吮的地方,我只需要减少它。

1 个答案:

答案 0 :(得分:1)

你可以尝试的事情:

  • 确保heavies()创建的矩阵副本不会在内存中保留引用。
  • 查看gc模块,致电collect()并使用set_threshold()
  • 将函数重写为迭代而不是递归