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.delayed
和 dask.array.from_delayed
创建您自己的数据读取函数。这篇博文可能提供了一个不错的例子:http://matthewrocklin.com/blog/work/2017/01/17/dask-images
我有一系列 *.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.delayed
和 dask.array.from_delayed
创建您自己的数据读取函数。这篇博文可能提供了一个不错的例子:http://matthewrocklin.com/blog/work/2017/01/17/dask-images