Оптимизирующая задача для сложной экологической модели - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь запустить экологическую модель в среде Dask. Хотя меня не совсем устраивает скорость расчетов. Я запускаю его локально на одной машине. Есть ли какие-то быстрые улучшения, заметные из приведенного ниже кода:

from dask_open import dask_slice
from dask.distributed import Client
from calc_si_no_bloom import calc_si_no_bloom
import time
import dask
client = Client(processes=False)
start_time = time.clock()
path_tx_01 = r'C:\Users\eobs_data\tx_mean_0.1_hom.nc'
path_tn_01 = r'C:\Users\eobs_data\tn_mean_0.1_hom.nc'
mindask, latlon, latitude = dask_slice(path_tn_01, 1980, 2018,250, -25, 45, 34, 72)
maxdask, latlon, latitude = dask_slice(path_tx_01, 1980, 2018,250, -25, 45, 34, 72)
lazy_results = dask.delayed(calc_si_no_bloom)(mindask,maxdask,latitude) 
# mindask and maxdask have a chunksize of (1, 20000, 250) and 39 chunks 
lfmtx, lfrz = lazy_results.compute()
print(time.clock() - start_time, "seconds for model run")

функция dask_slice:

def dask_slice(path, startyear, endyear, ndays, latmin, latmax, lonmin, lonmax):
data = xr.open_dataarray(path)
data = data.sel(time=slice('1950-01-01','2018-12-31'))
data = data.sel(latitude=slice(latmin,latmax))
data = data.sel(longitude=slice(lonmin,lonmax))
data = data.stack(latlon=['latitude','longitude'])
latlon = list(data.latlon.values) #latlon[45693] = (49.875,14.875)
latitude = data.latitude.values
group = data.groupby('time.year')
list_group = list(group)
dictio = dict((x,y) for x,y in list_group)
lijst = []
for i in range(startyear,endyear+1):
    year = dictio[i].values[:ndays,:]
    lijst.append(year)
daskarray = daar.stack(lijst, axis=0)
daskarray_F = tempunits(daskarray, 'C', 'F')
daskarray = np.swapaxes(daskarray_F,1,2)
return daskarray, latlon, latitude

Сама модель (calc_si_no_bloom) вычисляет совокупную температуру от минимальной и максимальной температуры. Он вызывает ряд различных функций, каждая из которых включает множество циклов for. Есть ли смысл в изменении структуры функций, составляющих модель, или я реализую Dask неэффективно?

Заранее спасибо!

1 Ответ

1 голос
/ 13 июня 2020

Первым шагом к повышению производительности вашего кода обычно является определение того, что работает медленно. Я рекомендую прочитать документацию Dask по Понимание производительности , а затем следовать некоторым предложениям.

После выполнения этой работы, если у вас есть дополнительные c вопросы, я рекомендую опубликовать снова более конкретный c вопрос (SO редко используется для общих c запросов «помогите мне улучшить мой код»)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...