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