为什么dask工作进程因“上的内存错误”而失败;“小”;任务大小?[Dask.bag]

为什么dask工作进程因“上的内存错误”而失败;“小”;任务大小?[Dask.bag],dask,dask-distributed,Dask,Dask Distributed,我正在多个图像上运行管道。管道包括从文件系统读取图像,对每个图像进行处理,然后将图像保存到文件系统。但是,dask工作进程由于内存错误而失败。 有没有办法确保dask工作人员不会在内存中加载太多图像?i、 e.在新图像上启动处理管道之前,等待工作进程上有足够的空间 我有一个调度器和40个工人,有4个内核,15GB内存,运行Centos7。我试图处理125个图像在一批;每个图像都相当大,但足够小,可以放在一个工人身上;整个过程大约需要3GB 我试着处理少量的图像,效果很好 已编辑 来自dask.d

我正在多个图像上运行管道。管道包括从文件系统读取图像,对每个图像进行处理,然后将图像保存到文件系统。但是,dask工作进程由于内存错误而失败。 有没有办法确保dask工作人员不会在内存中加载太多图像?i、 e.在新图像上启动处理管道之前,等待工作进程上有足够的空间

我有一个调度器和40个工人,有4个内核,15GB内存,运行Centos7。我试图处理125个图像在一批;每个图像都相当大,但足够小,可以放在一个工人身上;整个过程大约需要3GB

我试着处理少量的图像,效果很好

已编辑

来自dask.distributed import客户端,LocalCluster
#LocalCluster用于显示实际集群上工作进程的配置
client=client(LocalCluster(n_workers=2,resources={'process':1}))
路径=['list','of','path']
#从每个路径读取文件数据
data=client.map(读取、路径、资源={'process':1)
#对数据应用foo n次
对于范围内的u(n):
data=client.map(foo,x,resources={'process':1)
#保存处理后的数据
map(save,x,resources={'process':1)
#检索结果
client.gather(数据)
我希望图像能够被处理,因为工作人员身上有可用的空间,但似乎所有图像都同时加载到不同的工作人员身上

编辑: 我的问题是所有任务都分配给了工作者,而他们没有足够的内存。我发现了如何限制工作者在一个时刻处理的任务数量[这里]。 但是,由于这个限制,当我执行任务时,它们都完成了读取步骤,然后是处理步骤,最后是保存步骤。这是一个问题,因为映像已溢出到磁盘

在开始一项新任务之前,是否有办法完成每项任务?
e、 在Worker-1上:读取(img1)->进程(img1)->保存(img1)->读取(img2)->Dask通常不知道一个任务需要多少内存,它只能知道输出的大小,而且只能在输出完成后才知道。这是因为Dask只是执行一个pthon函数,然后等待它完成;但是所有的OSRT都可以在python函数中发生。您通常应该期望在o当您有可用的工作核心时开始—正如您所发现的

如果您想要一个较小的总内存负载,那么您的解决方案应该很简单:拥有足够少的工作线程,这样,如果所有工作线程都在使用您可以预期的最大内存,那么系统中仍然有一些空闲线程可以处理


编辑:您可能希望在提交之前尝试在图表上运行优化(尽管我认为这应该发生),因为听起来您的线性任务链应该“融合”。

我设法为每个工作人员修复了资源限制。但是,我在任务排程方面遇到了一些问题(请参阅有问题的编辑)。我尝试了您建议的方法。但是,如果可能的话,我不知道如何使用客户端API获取dask_图,因此我切换回使用bag API。这又带来了工人资源限制的问题。您是否知道如何在使用dask.bag时限制工人资源?请确保使用客户端进行计算,并限制NUB我用fuse和设置每个工人的资源限制来实现这一点。谢谢