问题描述
我在磁盘上有一个 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 (将#修改为@)