代码之家  ›  专栏  ›  技术社区  ›  Magnus Berg Sletfjerding

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

  •  2
  • Magnus Berg Sletfjerding  · 技术社区  · 8 年前

    我有一系列*。对numpy来说太大而无法处理的tiff电影 (shape = (1, 9000, 512, 512)) 看起来像是 dask.array.image.imread 可以处理这个问题(根据这个问题的答案: out of core 4D image tif storage as hdf5 python ).

    创建阵列时, 达斯克。大堆形象imread公司 当尝试导入任何大文件时,会出现内存错误。然而,它确实可以使用 shape = (1, 20, 512, 512) ,所以我认为这一定与块大小有关。我试着看看是否可以在imread中导入时更改块大小,但我没有找到任何结果。

    当达斯克自己的时候 imread 没用,我试过了 dask_imread package ,它似乎有能力将帧分割成块。有趣的是,在创建数组时,它给了我一个运行时警告,但是在 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 作为一个夸尔格。

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

    1 回复  |  直到 8 年前
        1
  •  1
  •   MRocklin    8 年前

    我怀疑 dask.array.imread 与单个大图像相比,使用许多小图像的堆栈效果更好。如果您知道如何只读取大图像中的一个切片,那么我建议您使用 dask.delayed dask.array.from_delayed . 这篇博客文章可能提供了一个不错的例子: http://matthewrocklin.com/blog/work/2017/01/17/dask-images