2014-11-07 2 views
0

У меня есть большое количество разных графиков (каждый 8000+ узлов). В igraph (версия 0.7.0) для python 2.7 я пытаюсь выполнить некоторые вычисления на кратчайших путях, рассчитанных на этих графиках. В цикле каждый граф импортируется в igraph, а затем вычисляются кратчайшие пути. Однако я заметил, что память, используемая python, увеличивается во время каждого цикла (хотя новые графики используются в каждом цикле). Через некоторое время моя программа вылетает из-за заполнения памяти. Это указывает на утечку памяти в igraph? Как я могу лучше всего решить эту проблему? (?)igraph для python: утечка памяти (?) В get_shortest_paths

Этой утечка памяти может быть продемонстрирована с кодом питона ниже:

import igraph as ig 
import psutil, os 
# Perform the operation below 100 times. 
for run in range(100): 
    mygraph = ig.Graph.Full(300) 
    # To speed up calculations only the nodes that can be reached in 10 steps are considered for the shortest paths 
    ig10neigh = mygraph.neighborhood(order = 10, mode = 'out') 
    for v in range(mygraph.vcount()): 
     paths = mygraph.get_shortest_paths(v, ig10neigh[v], mode = 'out', output = 'epath') 
     #Here some calculations with the paths 
    print psutil.Process(os.getpid()).get_memory_info()[0]/float(2 ** 20) # Print the memory use 

Когда я запускаю приведенный выше код моего использование памяти медленно увеличивается с от 22 МБ до 100 МБ.

Благодарим за помощь!

ответ

0

Я изучил это, и действительно, у Graph.get_shortest_paths(), к сожалению, есть утечка памяти, с которой легко работать. Я отправил patch в дерево разработки, которое решает проблему, но, к сожалению, вам придется перекомпилировать интерфейс Python с нуля, если вы хотите иметь это в своей собственной версии (или дожидаться следующей младшей версии).

+0

спасибо, что исправил эту утечку. К сожалению, я не сейчас, как скомпилировать igraph с нуля, поэтому мне придется ждать следующего релиза. Можно ли передать мой график в подпроцесс и запустить 'for v in range (mygrapp.vcount()):' loop в подпроцессе? Таким образом, память должна быть освобождена каждый раз, когда цикл завершен. –

Смежные вопросы