在快速本地集群上管理工作人员内存

Jon*_*nes 5 python pandas dask

我试图用dask加载数据集,但是当需要计算我的数据集时,我总是遇到这样的问题:

警告-工作者超出了95%的内存预算。正在重新启动。

我只是在本地计算机上工作,因此启动了dask,如下所示:

if __name__ == '__main__':
    libmarket.config.client = Client()  # use dask.distributed by default
Run Code Online (Sandbox Code Playgroud)

现在,在错误消息中,我一直看到对“ memory_limit =”关键字参数的引用。但是,我已经彻底搜索了dask文档,无法弄清楚如何在单机配置中增加流血的worker内存限制。我有256GB的RAM,在将其转换回pandas数据帧之前,我将删除将来的大多数列(20GB的csv文件),因此我知道它将适合内存。我只需要从代码中增加每个工人的内存限制(不使用dask-worker),以便可以处理它。

拜托,有人帮我。

dan*_*eck 15

该参数memory_limit可被提供给所述__init()__的功能ClientLocalCluster

一般说明

只是调用Client()是第一次调用的快捷方式LocalCluster(),然后Client是创建的集群(Dask:Single Machine)。当Client在没有 实例的情况下调用时LocalCluster, 的所有可能参数LocalCluster.__init()__都可以提供给 的初始化调用Client。因此,memory_limit该类n_workers的 API 文档中未记录该参数(以及其他参数,例如)Client

但是,该参数memory_limit似乎没有在 API 文档中正确记录LocalCluster(请参阅 Dask GitHub 问题#4118)。

解决方案

一个工作示例如下。我添加了更多参数,这可能对找到此问题/答案的人有用。

# load/import classes
from dask.distributed import Client, LocalCluster

# set up cluster and workers
cluster = LocalCluster(n_workers=4, 
                       threads_per_worker=1,
                       memory_limit='64GB')
client = Client(cluster)

# have a look at your workers
client

# do some work
## ... 

# close workers and cluster
client.close()
cluster.close()
Run Code Online (Sandbox Code Playgroud)

捷径是

# load/import classes
from dask.distributed import Client

# set up cluster and workers
client = Client(n_workers=4, 
                threads_per_worker=1,
                memory_limit='64GB')

# have a look at your workers
client

# do some work
## ... 

# close workers and cluster
client.close()
Run Code Online (Sandbox Code Playgroud)

进一步阅读