Python 达斯克';s imread返回MemoryError-在导入时更改块大小

Python 达斯克';s imread返回MemoryError-在导入时更改块大小,python,arrays,tiff,dask,Python,Arrays,Tiff,Dask,我有一系列*.tiff电影太大了,numpy无法处理(shape=(1,9000,512,512)),看起来dask.array.image.imread可以处理这个问题(根据这个问题的答案:) 创建数组时,dask.array.image.imread在尝试导入任何大文件时提供MemoryError。但是,它确实可以处理较小的文件堆栈,这些文件具有shape=(1,20,512,512),因此我认为它一定与块大小有关。我试着看看是否可以在imread中导入时更改块大小,但我没有发现任何东西 当

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

创建数组时,
dask.array.image.imread
在尝试导入任何大文件时提供MemoryError。但是,它确实可以处理较小的文件堆栈,这些文件具有
shape=(1,20,512,512)
,因此我认为它一定与块大小有关。我试着看看是否可以在imread中导入时更改块大小,但我没有发现任何东西

当dask自己的
imread
不起作用时,我尝试了,它似乎有能力将帧分割成块。有趣的是,它在创建数组时给了我一个运行时警告,但是在打印(foo_数组)时仍然返回

dask.array<from-value, shape=(1, 9000, 512, 512), dtype=uint16, chunksize=(1, 9000, 512, 512)>
dask.array<rechunk-merge, shape=(1, 9000, 512, 512), dtype=uint16, chunksize=(1, 20, 512, 512)>
正如所料

但是,在数组的任何元素上运行
.compute()
时,例如
print(foo_数组[01234123123].compute())
会给出内存错误。
我尝试过导入为
foo\u array=imread(file\u to\u use,chunksize=(1,20512512))
,但似乎
imread
都没有将
chunksize
作为一个标记


如何在导入时将
imread
中的chunksize更改为例如(1,20512512)(这似乎是可以管理的)

我怀疑
dask.array.imread
处理许多小图像的效果比处理单个大图像要好。如果您知道如何仅从大图像中读取一个切片,那么我建议您使用
dask.delayed
dask.array.from_delayed
创建自己的数据读取函数。这篇博文可能提供了一个不错的例子:

嗨,马格纳斯,我是《达斯克·伊姆雷德》的作者。当前设置为将第0轴作为帧编号。不过,如果您愿意,我们可以探索其他方法将文件切割成帧(甚至多个轴)。请随意提出回购协议的问题,我们可以讨论更多。感谢您尝试一下dask imread。