2013-07-12 102 views
3

我寫了一個遞歸函數,詳盡地生成某些特徵的矩陣。 功能是這樣:佔用太多內存 - python

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是,僅僅返回一個矩陣的與特性的列我需要以及一個功能。

問題是,由於重物產生了大量的矩陣,它佔用了太多的內存。 我最終從一個接一個地調用另一個函數,最終我佔用了太多的內存,並且我的進程被終止了(我在帶有內存上限的服務器上運行這個)。我怎麼寫這個讓它使用更少的內存?

程序看起來像:

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

可嘗試:

  • 確保通過heavies()產生的矩陣副本沒有在存儲器上的參考。
  • 看那gc模塊,稱之爲collect()和玩set_threshold()
  • 重寫功能是迭代的,而不是遞歸