【发布时间】:2018-05-10 19:59:30
【问题描述】:
我有一系列 *.tiff 电影对于 numpy 来说太大而无法处理 (shape = (1, 9000, 512, 512)) 并且似乎 dask.array.image.imread 可以处理这个问题(根据这个问题的答案:out of core 4D image tif storage as hdf5 python)。
在创建数组时,dask.array.image.imread 在尝试导入任何大文件时会出现 MemoryError。但是,它确实适用于具有shape = (1, 20, 512, 512) 的较小的文件堆栈,所以我认为它一定与块大小有关。我试图查看是否可以在 imread 中导入时更改块大小,但我没有找到任何东西。
当 dask 自己的imread 不起作用时,我尝试了dask_imread package,它似乎有能力将帧分割成块。有趣的是,它在创建数组时给了我一个 RuntimeWarning,但在 print(foo_array) 仍然返回
dask.array<from-value, shape=(1, 9000, 512, 512), dtype=uint16, chunksize=(1, 9000, 512, 512)>
整个文件的块大小。
尝试.rechunk((1,20,512,512)) 返回
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)(这似乎是可管理的)?
【问题讨论】:
-
嗨 Magnus,我是
dask-imread的作者。当前设置为将第 0 轴视为帧号。尽管如果您愿意,我们可以探索将文件切割成帧(甚至在多个轴上)的其他方法。请随时在 repo 上提出问题,我们可以讨论更多。感谢您尝试dask-imread。