分配的dask中的内存泄漏和/或数据持久性

时间:2017-10-31 17:10:13

标签: multiprocessing distributed dask

我正在使用dask / distributed向多节点集群提交100多个函数评估。每个eval都非常昂贵,大约90秒的CPU时间。我注意到,虽然我正在评估的功能并不纯粹,但似乎存在内存泄漏并且所有工作人员随着时间的推移而增长。 以下是重现此行为的示例代码:

import numpy as np
from dask.distributed import Client

class Foo:
    def __init__(self):
        self.a = np.random.rand(2000, 2000)  # dummy data, not really used

    @staticmethod
    def myfun1(k):
        return np.random.rand(10000 + k, 100)

    def myfun2(self, k):
        return np.random.rand(10000 + k, 100)

client = Client('XXX-YYY:8786')
f = Foo()
tasks = client.map(f.myfun2, range(100), pure=False)
results = client.gather(tasks)
tasks = []

如果调用client.map()来执行f.myfun1()(这只是一个静态方法),则工作者的大小不会增加。但是,如果一个人调用f.myfun2(),那么在上面只调用一个client.map()之后,工作者的大小会大大增加(例如50mb - > 400mb)。此外,client.close()不会减少工作人员的数量。

这是内存泄漏还是我没有正确使用dask.distributed?我绝对不关心我的计算结果在之后可用或在群集上共享。 FWIW,使用分布式v1.19.1和Python 3.5.4进行测试

1 个答案:

答案 0 :(得分:0)

很好的例子。

您的myfun2方法已附加到您的f = Foo()对象上,该对象带有一个相当大的属性(f.a)。因此,这种f.myfun2方法实际上非常昂贵,并且您可以创建1000个方法。如果可以,最好避免在分布式设置中使用大对象的方法。而是考虑使用函数。