Я пытался умножить несколько файлов netCDF друг на друга для вычислений на месте, таких как умножение растров, но я продолжаю получать разные ошибки, и я надеялся, что смогу получить некоторую помощь.
Мой полосы имеют следующую информацию (игнорируя атрибуты для ясности, я могу добавить ее при необходимости):
>>> precds
<xarray.Dataset>
Dimensions: (bnds: 2, lat: 360, lon: 720, time: 1827)
Coordinates:
* lon (lon) float32 -179.75 -179.25 -178.75 ... 178.75 179.25 179.75
* lat (lat) float32 -89.75 -89.25 -88.75 -88.25 ... 88.75 89.25 89.75
* time (time) datetime64[ns] 2016-01-01T12:00:00 ... 2020-12-31T12:00:00
Dimensions without coordinates: bnds
Data variables:
time_bnds (time, bnds) datetime64[ns] dask.array<chunksize=(10, 2), meta=np.ndarray>
prAdjust (time, lat, lon) float32 dask.array<chunksize=(10, 360, 720), meta=np.ndarray>
>>> wsxr
<xarray.DataArray (band: 1, y: 2160, x: 4320)>
[9331200 values with dtype=float32]
Coordinates:
* band (band) int64 1
* y (y) float64 89.96 89.87 89.79 89.71 ... -89.71 -89.79 -89.88 -89.96
* x (x) float64 -180.0 -179.9 -179.8 -179.7 ... 179.7 179.8 179.9 180.0
>>> tempds
<xarray.Dataset>
Dimensions: (bnds: 2, lat: 360, lon: 720, time: 1827)
Coordinates:
* lon (lon) float32 -179.75 -179.25 -178.75 ... 178.75 179.25 179.75
* lat (lat) float32 -89.75 -89.25 -88.75 -88.25 ... 88.75 89.25 89.75
* time (time) datetime64[ns] 2016-01-01T12:00:00 ... 2020-12-31T12:00:00
Dimensions without coordinates: bnds
Data variables:
time_bnds (time, bnds) datetime64[ns] dask.array<chunksize=(10, 2), meta=np.ndarray>
tasAdjust (time, lat, lon) float32 dask.array<chunksize=(10, 360, 720), meta=np.ndarray>
height float64 ...
Здесь precds
и tempds
могут успешно размножаться, но я могу кажется, что умножить tempds
и wsxr
или precds
и wsxr
без какой-либо формы ошибки.
Вот что я попробовал:
>>> multiplied = precds_var1 * cotton_dask500_ds
>>> multiplied.to_netcdf('multiplied.nc')
Error:
MemoryError: Unable to allocate array with shape (1827, 360, 720, 1, 2160, 500) and data type float32
Это странно, потому что мы используем систему, на которой установлено 256 ГБ ОЗУ, и даже после попытки это или используя только одну группу, сообщение об ошибке не изменилось.
Затем, думая, что это может быть из-за разных имен, мы изменили названия групп, но это тоже не сработало. Попытка убедиться, что они имеют одинаковые типы (т. Е. float32
и float64
все еще должны работать правильно?)
Мы также попытались применить функцию squeeze
, чтобы уменьшить общее количество количество измерений (может потребоваться проверить это, потому что мой коллега работал над этим, а не я), но это сообщение об ошибке, которое выскочило для меня:
>>> precipitation_slice_squeeze = precipitation_slice.squeeze()
>>> precipitation_slice_squeeze
<xarray.DataArray 'prAdjust' (lat: 360, lon: 720)>
dask.array<getitem, shape=(360, 720), dtype=float32, chunksize=(360, 720), chunktype=numpy.ndarray>
Coordinates:
* lon (lon) float32 -179.75 -179.25 -178.75 ... 178.75 179.25 179.75
* lat (lat) float32 -89.75 -89.25 -88.75 -88.25 ... 88.75 89.25 89.75
time datetime64[ns] 2019-01-01T12:00:00
>>> precipitation_slice_squeeze * wsxr_renamed_squeeze
ValueError: zero-size array to reduction operation minimum which has no identity
Очевидно, мы что-то делаем действительно очень неправильно. Мы довольно плохо знакомы с XArray и не имеем большого опыта работы с ними. Наша главная цель - выполнить растровый расчет на месте, поэтому любая помощь будет полезна!