2013-07-12 6 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()
  • Перепишите функцию, чтобы быть итеративным вместо рекурсивных
Смежные вопросы