我正在使用Google Earth工具箱,用於Octave,這與爲MATLAB編制的相同庫非常相似。有關該工具的MATLAB文檔,請參見this link。優化八度/ matlab函數的運行時間
不幸的是我對某個功能有點麻煩:ge_quiver
。該函數創建顫抖圖並將結果轉換爲KML代碼。我的問題 是,它有點太慢,我不喜歡。
對於30x30大小的數據變量,該函數大約需要10秒才能完成。這很好,除了我試圖製作一個動畫顫動情節以及其他23個相同大小的數據變量(共24個)。由於Octave(和MATLAB就此而言)通常只在一個線程上運行,因此整個事件將連續運行,並且需要10 * 24 = 240 s。
我試過parfor
循環,但它們只從總運行時間中移除了10秒。我有一個16核的電腦。考慮,這是尷尬的並行(變量之間沒有相關性),這理想地應該採取:
10秒前16個變量
+ 10秒的剩餘8個變量
--------- ---------------------------------------------
= 20秒總。
我甚至沒有測試過arrayfun,因爲我不知道如何調整我的函數(p_ge_quiver
)。儘管如此,許多人說arrayfun不會讓它變得更快。
下面的代碼大概是我想要做的。請記住變量 data_u
的大小爲30x30x24。 data_v
,lon
和lat
也是如此。
...
...
[YYYY,MM,DD,HH,mm,ss] = ncdate(NCFILE);
date_s.year = YYYY;
date_s.month = MM;
date_s.day = DD;
date_s.hour = HH;
date_s.minute = mm;
date_s.second = ss;
TIMESTEP = 60;
parfor i = 1:size(data_u,3)
dt = TIMESTEP*i;
kml(i) = p_ge_quiver(lon,lat,data_u,data_v,dt,TIMESTEP,data_s);
endparfor
...
...
function kml = p_ge_quiver(lon,lat,u,v,data_time,step,date_s)
% V_GE_QUIVER - Writes the quiver plot into KML.
% Get date variables.
YYYY = date_s.year;
MM = date_s.month;
DD = date_s.day;
HH = date_s.hour;
mm = date_s.minute;
ss = date_s.second;
% Date format. Use Google's.
F = 'yyyy-mm-ddTHH:MM:SSZ';
% Start and end dates of data.
tStart = datestr(datenum(YYYY,MM,DD,HH,mm+data_time,ss),F);
tEnd = datestr(datenum(YYYY,MM,DD,HH,mm+data_time+step,ss),F);
% Quiver plot.
kml = ge_quiver(lon,lat,u,v,'timeSpanStart', tStart, ...
'timeSpanStop' , tEnd , ...
'visibility' , 0 , ...
'lineColor' , 'AAFFFFFF');
end
糾正我,如果我錯了,但我不認爲''parfor'是在Octave中實現的(它被解析器識別,但現在只是一個常規的'for'-loop)..它有一些函數用於'general'包中的並行計算:http://octave.sourceforge。net/general/overview.html#ParallelComputing – Amro
我也讀過這個,但是我測量了for和parfor實現之間的10秒差異。很混亂。 – jhc
我假設(至少在Matlab中)在運行你的代碼之前你打開了一個'matlabpool'?雖然三個30×30×24的數組並不是很多內存,但誰知道'ge_quiver'在內存中是怎麼做的。 – horchler