Dask 的 imread returns MemoryError - 在导入时更改块大小

Dask's imread returns MemoryError - change chunk sizes on import

我有一系列 *.tiff 电影,对于 numpy 来说太大了,无法处理 (shape = (1, 9000, 512, 512)),而且 dask.array.image.imread 似乎可以处理这个(根据这个问题的答案:).

创建数组时,dask.array.image.imread 在尝试导入任何大文件时会出现 MemoryError。但是,它确实适用于 shape = (1, 20, 512, 512) 的较小文件堆栈,因此我认为它一定与块大小有关。我试图查看是否可以在 imread 中导入时更改块大小,但我没有找到任何东西。

当 dask 自己的 imread 不起作用时,我尝试了 dask_imread package,它似乎具有将帧分成块的能力。有趣的是,它在创建数组时给了我一个 RuntimeWarning,但是在 print(foo_array) 仍然 returns

dask.array<from-value, shape=(1, 9000, 512, 512), dtype=uint16, chunksize=(1, 9000, 512, 512)>

使用 整个文件的块大小。
尝试 .rechunk((1,20,512,512)) returns

dask.array<rechunk-merge, shape=(1, 9000, 512, 512), dtype=uint16, chunksize=(1, 20, 512, 512)>

符合预期。

但是,当 运行 .compute() 在数组的任何元素上时,例如 print(foo_array[0,1234,123,123].compute()) 会给出 MemoryError。
我试过导入为 foo_array = imread(file_to_use,chunksize=(1,20,512,512)) 但似乎 imread 都没有将 chunksize 作为 kwarg。

如何在 imread 中将导入时的块大小更改为例如 (1,20,512,512)(这似乎是可管理的)?

我怀疑 dask.array.imread 处理许多小图像的堆栈比处理单个大图像效果更好。如果您知道如何只读取大图像的一部分,那么我建议您使用 dask.delayeddask.array.from_delayed 创建您自己的数据读取函数。这篇博文可能提供了一个不错的例子:http://matthewrocklin.com/blog/work/2017/01/17/dask-images