Как уменьшить использование параллельной памяти Ipython

Я использую Ipython parallel в алгоритме оптимизации, который зацикливается большое количество раз. Параллелизм вызывается в цикле с использованием метода map LoadBalancedView (дважды), интерфейса словаря DirectView и вызова магии %px. Я запускаю алгоритм в блокноте Ipython.

Я обнаружил, что память, потребляемая как ядром, выполняющим алгоритм, так и одним из контроллеров, неуклонно увеличивается с течением времени, что ограничивает количество циклов, которые я могу выполнить (поскольку доступная память ограничена).

Используя heapy, я профилировал использование памяти после выполнения около 38 тысяч циклов:

Partition of a set of 98385344 objects. Total size = 18016840352 bytes.  
 Index  Count     %       Size   %  Cumulative   % Kind (class / dict of class)
     0  5059553   5 9269101096  51  9269101096  51 IPython.parallel.client.client.Metadata
     1 19795077  20 2915510312  16 12184611408  68 list
     2 24030949  24 1641114880   9 13825726288  77 str
     3  5062764   5 1424092704   8 15249818992  85 dict (no owner)
     4 20238219  21  971434512   5 16221253504  90 datetime.datetime
     5   401177   0  426782056   2 16648035560  92 scipy.optimize.optimize.OptimizeResult
     6        3   0  402654816   2 17050690376  95 collections.defaultdict
     7  4359721   4  323814160   2 17374504536  96 tuple
     8  8166865   8  196004760   1 17570509296  98 numpy.float64
     9  5488027   6  131712648   1 17702221944  98 int 
<1582 more rows. Type e.g. '_.more' to view.>

Вы можете видеть, что примерно половина памяти используется IPython.parallel.client.client.Metadata экземплярами. Хорошим индикатором кэширования результатов map вызовов является 401177 OptimizeResult экземпляров, то же число, что и количество вызовов оптимизации через lbview.map — я не кэширую их в своем коде.

Есть ли способ контролировать это использование памяти как на ядре, так и на параллельном контроллере Ipython (у которого потребление памяти сопоставимо с ядром)?


person drevicko    schedule 11.06.2015    source источник


Ответы (1)


Параллельные клиенты и контроллеры Ipython хранят прошлые результаты и другие метаданные прошлых транзакций.

Класс IPython.parallel.Client предоставляет метод очистки этих данных:

Client.purge_everything()

задокументировано здесь. Существуют также методы purge_results() и purge_local_results(), которые дают вам некоторый контроль над тем, что очищается.

person drevicko    schedule 14.06.2015