我在一个循环很多次的优化算法中使用Ipython parallel。使用map
的{{1}}方法(两次),LoadBalancedView
的字典界面和DirectView
魔法的调用,在循环中调用并行性。我在Ipython笔记本中运行算法。
我发现运行算法的内核和其中一个控制器消耗的内存随着时间的推移而稳定增加,限制了我可以执行的循环次数(因为可用内存有限)。
使用%px
,我在大约38,000次循环运行后分析了内存使用情况:
heapy
您可以看到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
调用产生的一个好指标是401177 map
个实例,与通过OptimizeResult
优化调用的数量相同 - 我没有在我的代码中缓存它们
有没有办法可以控制内核和Ipython并行控制器上的内存使用量(内存消耗与内核相当)?
答案 0 :(得分:1)
Ipython并行客户端和控制器存储过去事务中的过去结果和其他元数据。
IPython.parallel.Client
类提供了清除此数据的方法:
Client.purge_everything()
documented here。还有purge_results()
和purge_local_results()
方法可以让您控制清除的内容。