来自库的Dask循环开销

来自库的Dask循环开销,dask,scikit-image,zarr,Dask,Scikit Image,Zarr,当调用另一个库到dask时,如scikit图像对比度拉伸,我意识到dask正在为每个块创建一个结果,存储在内存中或分别溢出到磁盘。然后它尝试合并所有结果。如果您在集群或单台计算机上,并且阵列的数据集很小,那么一切都可以得到很好的控制,这很好。当您使用比RAM或磁盘大得多的数据集时,问题就开始出现了。有没有办法缓解这一问题,或者使用zarr文件格式保存数据,以便在进行更新时更新值?也许这太离奇了。除了购买更多ram之外,其他任何想法都会有所帮助 编辑 我在看关于dask的文档,关于dask块大小

当调用另一个库到dask时,如scikit图像对比度拉伸,我意识到dask正在为每个块创建一个结果,存储在内存中或分别溢出到磁盘。然后它尝试合并所有结果。如果您在集群或单台计算机上,并且阵列的数据集很小,那么一切都可以得到很好的控制,这很好。当您使用比RAM或磁盘大得多的数据集时,问题就开始出现了。有没有办法缓解这一问题,或者使用zarr文件格式保存数据,以便在进行更新时更新值?也许这太离奇了。除了购买更多ram之外,其他任何想法都会有所帮助


编辑

我在看关于dask的文档,关于dask块大小的建议大约是100MB。最后,根据文件大小的不同,我将数据量大大减少到30-70MB。然后我做了对比拉伸(不是从库中,而是使用numpy unfunc,我没有任何问题!事实上,我使用了计算的方式。因为我从一个uint8 3dim数组开始,当乘以对比度拉伸的比率时,我不可避免地将数组块增加到浮点64数组。这占用了大量内存和计算。因此,我得到了o将da.array视为np.asarray(float64)但只有在乘以浮点数之前。然后返回uint8以完成计算。对于20GB的文件,拉伸时间已减少到不到5分钟。因此,我认为这是一个积极的步骤。只是意味着没有库的图像处理,我将,看看rechunker


我正在构建的图像处理管道将不可避免地用于大约250-300GB的合并数据集(肯定超出了我笔记本电脑的限制)。我也没有时间去处理云中的云或parralell处理。这需要几个月的时间。现在,我正在努力完成这项分析。

是的,你可以做你所说的那种事情。我鼓励你去看看这个项目,它专门用于改变zar中数据的布局r存储,但展示了如何保存临时中间数据,以缓解内存和通信问题。

Hi-Sh4z,您介意提供完整的吗?不确定这是否是您已经看过的内容,但除了块大小之外,您还应该查看使用了多少dask工作进程。内存量将是与
num_workers*chunk_size
成比例,这取决于每个任务必须分配多少块大小的数组。如果您有很多内核,但没有很多内存,请尝试减少worker的数量。这样dask在内存中一次只能有几个块。谢谢@mdurant,我来看看。