2015-06-11 2 views
0

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

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

Использование heapy, я профилированного использование памяти после пробега около 38000 циклов:

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 (потребление памяти от пользователя сопоставимо с ядром)?

ответ

1

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

IPython.parallel.Client класс обеспечивает способ очистки данных:

Client.purge_everything() 

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