【问题标题】:dask histogram from zarr file (a big zarr file)来自 zarr 文件的 dask 直方图(一个大 zarr 文件)
【发布时间】:2020-05-14 03:42:12
【问题描述】:

所以这是我的问题,我有一个大小为 100GB 的大 3dim 数组作为#zarr 文件(该数组的大小超过两倍)。我尝试使用#Dask 中的直方图进行计算,但我收到一条错误消息,指出它不能这样做,因为文件在元组中有元组。我猜那是 zarr 文件格式而不是其他任何东西?

有什么想法吗?

编辑: 是的,更大的计算机实际上无法工作......

我在一台机器上运行一个 dask 客户端,它运行计算但只是卡在某个地方。

我刚刚在文件中尝试了 dask.map 函数,但是当我将它绘制出来时,我得到了这样的结果:

ValueError: setting an array element with a sequence.

这是脚本的一个版本:

def histo(img):
    return da.histogram(img, bins=255, range=[0, 255])

histo_1 = da.map_blocks(histo, fimg)

我实际上会尝试在地图功能之外使用它。我想知道,而不是地图功能,地图块的窗口是否真的导致了这个问题。好吧,我会告诉你是现在还是现在....

编辑 2

所以我尝试按照建议删除地图块功能,这是我的结果:


[in] h, bins =da.histogram(fused_crop, bins=255, range=[0, 255])

[in] bins
[out] array([  0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.,
        11.,  12.,  13.,  14.,  15.,  16.,  17.,  18.,  19.,  20.,  21.,
        22.,  23.,  24.,  25.,  26.,  27.,  28.,  29.,  30.,  31.,  32.,
        33.,  34.,  35.,  36.,  37.,  38.,  39.,  40.,  41.,  42.,  43.,
        44.,  45.,  46.,  47.,  48.,  49.,  50.,  51.,  52.,  53.,  54.,
        55.,  56.,  57.,  58.,  59.,  60.,  61.,  62.,  63.,  64.,  65.,
        66.,  67.,  68.,  69.,  70.,  71.,  72.,  73.,  74.,  75.,  76.,
        77.,  78.,  79.,  80.,  81.,  82.,  83.,  84.,  85.,  86.,  87.,
        88.,  89.,  90.,  91.,  92.,  93.,  94.,  95.,  96.,  97.,  98.,
        99., 100., 101., 102., 103., 104., 105., 106., 107., 108., 109.,
       110., 111., 112., 113., 114., 115., 116., 117., 118., 119., 120.,
       121., 122., 123., 124., 125., 126., 127., 128., 129., 130., 131.,
       132., 133., 134., 135., 136., 137., 138., 139., 140., 141., 142.,
       143., 144., 145., 146., 147., 148., 149., 150., 151., 152., 153.,
       154., 155., 156., 157., 158., 159., 160., 161., 162., 163., 164.,
       165., 166., 167., 168., 169., 170., 171., 172., 173., 174., 175.,
       176., 177., 178., 179., 180., 181., 182., 183., 184., 185., 186.,
       187., 188., 189., 190., 191., 192., 193., 194., 195., 196., 197.,
       198., 199., 200., 201., 202., 203., 204., 205., 206., 207., 208.,
       209., 210., 211., 212., 213., 214., 215., 216., 217., 218., 219.,
       220., 221., 222., 223., 224., 225., 226., 227., 228., 229., 230.,
       231., 232., 233., 234., 235., 236., 237., 238., 239., 240., 241.,
       242., 243., 244., 245., 246., 247., 248., 249., 250., 251., 252.,
       253., 254., 255.])

[in] h.compute
[out] <bound method DaskMethodsMixin.compute of dask.array<sum-aggregate, shape=(255,), dtype=int64, chunksize=(255,), chunktype=numpy.ndarray>>

我打算在另一个笔记本中尝试,看看它是否仍然出现。

编辑 3

这很奇怪,但如果我只声明变量 h,它会作为 dask 数组中的一个小元素出现?

编辑

奇怪,如果我调用 xarray.hist 或 da.hist 函数,它们都会倒下。如果我使用 skimage.exposure.histogram 它可以工作,但似乎在计算直方图之前 zarr 文件已解压缩。这有点问题...

2020 年 6 月 7 日更新(针对不大但令人讨厌的中等数据的解决方案)请参阅下面的答案。

【问题讨论】:

    标签: image processing histogram dask zarr


    【解决方案1】:

    2020 年 6 月 7 日更新(针对不大但令人讨厌的中等数据的解决方案):

    所以不幸的是,我这次有点病了,我花了一段时间才感觉好一点。然后大流行发生了,我承担了全部的育儿职责。我尝试了很多不同的选择,最终,这看起来是这样的:

    1) 如果只使用 x.compute,内存会很快填满。

    2) 使用分布式会使硬盘驱动器溢出到磁盘并花费数小时,但会挂起并崩溃并且不执行任何操作,因为...它会计算(我在这里猜测,但基于图形和 dask api)它会为每个块创建一个子直方图数组......这都需要在某个时候合并。

    3) 我的数据分块是次优的,因此任务量很大,但即便如此,当我改进分块时我也无法计算直方图。

    最后我寻找了一种更新直方图数据的动态方法。所以我用 Zarr 来做,通过计算它。因为它允许并发读取和写入功能。提醒一下:我的数据是 3 个暗淡 x、y、z 的 zarr 数组,未压缩 300GB,但压缩后约为 100GB。在我 4 岁的笔记本电脑上使用以下 16GB 内存(我应该说我的数据是 16 位无符号的:

    imgs = da.from_zarr(.....)
    
    imgs2 = imgs.rechunk((a,b,c)) ## individual chunk dim per dim
    
    h, bins = da.histogram(imgs2, bins = 255, range=[0, 65535]) # binning to 256 
    
    h_out = da.to_zarr(h, "histogram.zarr")
    

    我在进程旁边运行进度条并从文件中获取直方图:

    [########################################] | 100% Completed | 18min 47.3s
    

    我认为这对于 300GB 阵列来说还不错。希望这对其他人也有帮助,感谢今年早些时候@mdurant 的帮助。

    【讨论】:

      【解决方案2】:

      您可能希望为此使用dask's function 而不是map_blocks。对于后者,Dask 期望每次调用的输出与输入块的大小相同,或者是从输入块派生的形状,而不是直方图的一维固定大小输出。

      h, bins =da.histogram(fused_crop, bins=255, range=[0, 255])
      h.compute()
      

      【讨论】:

      • 所以,我想到了同样的事情,并在没有整个 map_blocks 的情况下再次尝试,但 h 只指向一个元素。然后当我尝试计算时,我得到以下输出:&lt;bound method DaskMethodsMixin.compute of dask.array&lt;sum-aggregate, shape=(255,), dtype=int64, chunksize=(255,), chunktype=numpy.ndarray&gt;&gt;
      • 你最好准确地展示你运行的代码
      • 抱歉在这里添加代码并不容易。我把它贴在主要评论中
      • 这正是你应该做的
      • 找到方法或函数时怎么办?也许叫它!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      • 2023-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多