гистограмма dask из файла zarr (большой файл zarr) - PullRequest
0 голосов
/ 28 января 2020

Итак, мой вопрос, у меня есть большой массив 3dim размером 100 ГБ в виде файла #zarr (размер массива более чем в два раза больше). Я пытался использовать гистограмму из #Dask для расчета, но я получаю сообщение об ошибке, в котором говорится, что он не может этого сделать, поскольку файл содержит кортежи внутри кортежей. Я предполагаю, что это формат файла zarr, а не что-нибудь еще?

есть мысли?

edit: да, более крупная компьютерная вещь не будет работать на самом деле ...

Я управляю делом клиент на одной машине, он выполняет вычисления, но просто где-то застревает.

Я только что попробовал функцию 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)

Я действительно собираюсь использовать его вне функции карты. Интересно, а не функция карты, действительно ли проблема заключается в использовании окон из блоков карты. ну, плохо, дайте вам знать, если это или сейчас ....

edit 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>>

я собираюсь попробовать в другой записной книжке и посмотреть, происходит ли это по-прежнему.

edit 3

это странная вещь, но если я просто объявляю переменную h, она выходит как один маленький элемент из массива dask?

edit

Странно, если я вызову функцию xarray.hist или da.hist, они оба упадут. Если я использую гистограмму skimage.exposure.his, она работает, но кажется, что файл zarr распаковывается до того, как гистограмма будет рассчитана. Что является небольшой проблемой ...

1 Ответ

1 голос
/ 28 января 2020

Вы, вероятно, захотите использовать для этого функцию dask вместо map_blocks. Для последнего Dask ожидает, что выходные данные каждого вызова будут иметь тот же размер, что и входной блок, или форму, полученную из входного блока, вместо одномерного вывода гистограммы фиксированного размера.

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