2012-02-01 79 views
2

我想要做的是监控系统资源使用情况,并动态增加/减少池中的工作量。python多处理中的动态工作池管理

我有一个24核心节点和48GB的RAM,我所做的是在一个4GB数据文件中读取,我需要过滤。该系统也被其他人使用,因此可用内存随时间而变化。由于4GB输入数据被复制到所有工作人员(我还没有找到一种方法来避免这种情况,因为我只需要在工作人员中只读它,建议欢迎,这是一个dict()和dict()列表)这意味着我无法派出24名工人,因为我立即用完了内存。所以我想要做的就是开始这个​​过程,说一个安全数量为6的工人,然后观察内存使用情况,并产生额外的工作人员到池中,如果内存使用率高,减少工人的数量(即允许一些完成,但不会为这些工作者产生新的任务)。这样我可以最大限度地利用节点,同时保持95%的内存使用率。

这将是有效的原因是因为整个代码几个小时甚至跑6-12并行的工人,所以如果我甚至可以在一段时间增加工人的数量20-30%它会降低总执行时间处理时间。

现在我用两个Pool.map()和Pool.apply_async()方法来发送任务池中,以便我没有直接的偏好,如果一个方法比另一个更好。

在此先感谢您的建议。

回答

3

多处理模块提供了多进程的方式来share a dict

manager = mp.Manager() 
d = manager.dict() 

也许通过使用一个共享的字典,你能产卵24名工人和仍然使用远远更少的内存。当一个工人访问或变异的字典,其他工人将阻塞,如果他们也试图访问或突变的字典,但如果这不是主要的瓶颈,能够使用24名工人可以大大减少你的执行时间。

+0

事实上,使用管理限制了内存曝光,并允许所以对我来说暂时已经缓解了问题运行多个进程,但它仍然是很好的知道如何动态地管理池的工人数量。 – 2012-02-01 16:21:33