特定の特性の行列を網羅的に生成する再帰関数を作成しました。関数は次のとおりです。
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 は、必要な特性を持つ行列の列を返すだけの関数です。
問題は、ヘビーが多くの行列を生成するため、大量のメモリを消費することです。私はこれを別の関数から1つずつ呼び出すことになり、最終的に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
そして、重い関数が大量のメモリ消費が発生している場所であることを知っています。それを減らす必要があるだけです。