Загрузите данные из области dask в parellel кусками - PullRequest
0 голосов
/ 05 марта 2019

У меня есть большой набор данных xarray, загруженный в кадр данных dask, который содержит данные как в довольно большом пространственном, так и во временном диапазоне. Я пытаюсь загрузить эти данные в память, используя dask, разделив их на более мелкие куски и загрузив их параллельно. Ниже приведен пример кода того, что я пытаюсь сделать:

import numpy as np
import xarray as xr

def chunk(ds,x_ends,y_ends):
    '''
    Function which takes a large dataset which has been lazily loaded and specified
    indices within the dataset, and cuts out the chunk and loads it into memory. 
    '''

    chunk = ds.isel(x=slice(x_ends[0],x_ends[1]),y=slice(y_vals[0],y_vals[1]))

    with ProgressBar():
        chunk = chunk.compute()
    return chunk

dval = np.random.randint(5,size=[10,100,100])
x = np.linspace(0,100,101,dtype=int)
y = np.linspace(0,100,101,dtype=int)
time = np.linspace(0,10,11,dtype=int)

data = xr.DataArray(dval,coords=[time,x,y],dims=['time','x','y'])

x_vals = np.arange(0,len(data.x),1000)
x_vals = np.append(x_vals,len(data.x))
y_vals = np.arange(0,len(data.y),1000)
y_vals = np.append(y_vals,len(data.y))

for i in range(len(x_vals)-1):
    for j in range(len(y_vals)-1):
        chunk(data,[x_vals[i],x_vals[i+1]],[y_vals[j],y_vals[j+1]])

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

Ранее я пытался использовать клиентский класс dask.distributed, но это сломало функцию .compute (). Я чувствую, что, возможно, есть относительно простой ответ, который я просто ищу не в том месте.

1 Ответ

0 голосов
/ 07 марта 2019

Существует следующая функция для создания изрезанного кускового варианта вашего Xarray: http://xarray.pydata.org/en/stable/generated/xarray.DataArray.chunk.html Это будет делать то, что вы хотите для примера с игрушкой.Операции с этими данными затем будут выполняться по частям и, вероятно, будут хорошо распараллелены.

Однако вы чаще хотите разделить данные на части под нагрузкой, чем разделять массив, уже находящийся в памяти.Большинство функций загрузки xarray позволяют вам указать chunks=, что автоматически сделает внутреннюю модель данных неясной и даст вам параллельную и / или внешнюю обработку.Формат zarr особенно удобен для такого рода операций, поскольку каждый блок данных хранится в отдельном файле и при желании может быть легко загружен из удаленной системы хранения.

...