使用 Dask 在非常大的 3D 图像数据集上运行图像处理计算时,如何管理内存?

问题描述

我在磁盘上有一个 5230x5229x500 的 3D 图像作为 40 GB 以上的二进制文件,我想使用 dask 在它上面运行一些图像处理计算。我是 dask 的新手,我的本地机器只有大约 20 GB 的 RAM。

我当前的代码

from dask.distributed import Client,LocalCluster

import dask.array.image
import numpy as np
import dask.array as da
import dask

import itk

import os
import time

local_cluster = LocalCluster(n_workers=5,processes=False)
client = Client(local_cluster)

# An example image processing pipeline with a parameter
def my_processing_pipeline(image_chunk,radius=2):    
    denoised = itk.median_image_filter(image_chunk,radius=radius)
    return denoised

input_filepath = 'path/to/giant/binary/data/file.bin' # 40+ GB file of unsigned chars

dt = np.dtype(np.uint8)
lazy_array = dask.delayed(np.fromfile)(input_filepath,dtype=dt)
lazy_array = dask.delayed(lazy_array.reshape)(5230,5229,500)
lazy_array = da.from_delayed(lazy_array,shape=(5230,500),dtype=dt)
chunked_array = lazy_array.rechunk((5230,10))

start = time.time()

denoised_array = client.submit(my_processing_pipeline,chunked_array)

elapsed = time.time() - start
print(elapsed,'seconds')

上面的代码会填满整个集群的内存空间,直到它崩溃。这是有道理的,因为我正在对数组的每个块进行计算,因此(据我所知)集群将尝试将整个数组加载到内存中以进行这些计算。

有没有一种方法可以使用 dask 在像这样的大型数据集上运行计算,而不会耗尽集群的内存?我是否误解了 dask 的基本用途?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)