привязать меньшую сетку к большей предварительно определенной сетке с помощью xarray - PullRequest
0 голосов
/ 29 августа 2018

У меня есть код, как показано ниже. Таким образом, в основном я предопределил сетку, и я делаю цикл каждую маленькую сетку для этой большой предопределенной сетки. Но код застрял в reindex part.it, просто используя слишком много памяти, и он сломался. Есть ли другой способ, которым я могу привязать маленькую сетку к большей сетке?

latitudes=np.linspace(20.0000,50.0000,100001)

longitudes=np.linspace(-130.0000,-100.0000,100001)

AREASCORE=np.full((100001,100001),255,dtype=np.uint8)

AREAFUEL=np.full((100001,100001),255,dtype=np.uint8)

datasets_WFHS= xr.DataArray(AREASCORE,name='AREASCORE',dims='latitude','longitude'],coords={'latitude':latitudes,'longitude':longitudes})

print ("created empty array")





for d in glob.glob(r'Z:\travelers\shp\test\*WFHS.nc'):

    d=xr.open_dataset(d)

    d=d.reindex({'latitude': latitudes, 'longitude': longitudes}, method='nearest', tolerance=0.0001)

    print ('done reindex')

    d=d.fillna(255).astype(np.uint8)

    print ("done fillna")

    datasets_WFHS = xr.where(d==255, datasets_WFHS['AREASCORE'], d['AREASCORE'])

    print ("done np where")

1 Ответ

0 голосов
/ 29 августа 2018

Здесь вы создаете несколько гигантских массивов - массив с формами (100001, 100001) и uint8 dtype требует 10 ГБ для представления в памяти. Обычно для удобства манипулирования массивами с помощью NumPy требуется размер по крайней мере в 3-4 раза больше, чем у самых больших массивов, поэтому я не удивлюсь, если это не удастся выполнить на любой машине с общим объемом оперативной памяти менее 64 ГБ.

Вы должны попробовать , открывая наборы данных с помощью dask , который работает с xarray, чтобы поддерживать работу с массивами, размер которых больше, чем умещается в памяти. Это может быть так просто, как добавление аргумента chunks к вашему вызову xr.open_dataset().

...