任务之间保留的 dask-worker 内存

s1m*_*0d3 8 python parallel-processing dask dask-distributed

介绍

我正在使用dask.distributed(令人尴尬的并行任务)并行化一些代码。

  • 我有一个指向不同图像的路径列表,这些图像散布给工作人员。
  • 每个工作人员加载和过滤图像(3D 堆栈)并运行一些过滤。使用 scipy 进行 3D 过滤可节省中间体输出。
  • 每个过滤后的图像在磁盘上保存为 npy 和/或 png。
  • 我在集群上运行之前在本地进行测试,我的设置是:

.

from dask.distributed import Client, LocalCluster
cluster = LocalCluster(n_workers=2, threads_per_worker=1,memory_limit =8e9)
client = Client(cluster)
Run Code Online (Sandbox Code Playgroud)

问题:

  • 当我只处理两个图像(1 个图像/工人)时,一切都很好
  • 当我为每个工作人员散布多个图像时,我会收到此警告,其中进程内存值增加。

.

distributed.worker - WARNING - Memory use is high but worker has no data to store to disk.
Perhaps some other process is leaking memory?  Process memory: 6.21 GB -- Worker memory limit: 8.00 GB
Run Code Online (Sandbox Code Playgroud)

暗示工作人员使用的部分 RAM 不在freed不同文件之间(我猜是剩余的过滤中间体......)

有没有办法在开始处理下一个图像之前释放工人的内存?我必须garbage collector在运行任务之间运行一个循环吗?

编辑

gc.collect()在工作人员运行的函数末尾包含了调用,但没有消除警告。

非常感谢您的帮助!

joe*_*oeb 1

只要客户端保存分布式值的引用计数,集群就不会从内存中清除它。管理内存文档对此进行了详细说明,特别是“清除数据”部分。