使用大型中间件功能快速完成内存构建

时间:2018-07-18 19:38:23

标签: memory-leaks multiprocessing dask dask-distributed

我对dask.compute()有一个一般性的问题,该问题是由我在使用该函数时遇到的内存累积引起的。我正在使用dask.compute()和map_partitions()(尝试过dask.distributed和dask.multiprocessing(后者同时使用pool = ThreadPool和pool = multiprocessing.pool))来应用执行一系列操作的函数对dask数据帧的大块操作。函数的输出是一个相对较小的矩阵,但是函数内的运算涉及非常大的中间矩阵。尽管删除了这些中间体,但随着时间的推移,我的内存积聚了很多,最终导致内核死亡。这使我想知道dask是否仅根据最终输出变量的预期大小而不是根据函数内的大量计算分配作业,从而导致发送过多的作业和内存耗尽。这可能吗?感谢您对可能出问题的任何见解。

1 个答案:

答案 0 :(得分:0)

围绕着许多类似的问题(例如https://github.com/dask/distributed/issues/1795和其他地方)。就像该问题一样,您可能希望首先在该函数上运行典型的python内存监视工具,以查看这是否是固有行为。

从本质上讲,人们在创建和删除大量熊猫数据帧时一直在经历内存积聚,这似乎是一个与繁琐甚至更深层次的malloc问题无关的熊猫问题。您可以执行一些典型的事情,例如强烈确保不保持引用有效,并且可以在代码中调用gc.collect()