循環行為非常緩慢我有一個關於循環所花時間的問題。
我正在分析大量生產數據,通常為 1mio 行。
對於每一行,生產捕獲狀態(列 Statusnummer)。
如果狀態為“1”,那麼我想計算實際值(“ist”)和設定值(“soll”)。
所以我需要計算 1mio 行。 我在程式碼中針對不同的值多次執行此操作。
有時,循環很快(60 秒),有時又非常(!)慢(超過一天! 處理器仍在滿載工作!)。
所有列都設定為數字和連續,但我無法弄清楚為什麼有些循環非常慢。
我什至檢查單元格是否包含缺失值(請參閱範例程式碼);但代碼仍然很慢。
知道嗎,我做錯了什麼?
貂
程式碼範例,速度很慢:
for(i=1,i<=NRows(dt),i++,(
if(dt:Statusnummer[i] == 1,(
if(!isMissing(dt:Drehzahl[i]) & !isMissing(dt:geschw[i]) ,(
ist = dt:Drehzahl[i];
soll = dt:SollDrehzahl[i];
dt:Soll_drehzahl[i] = soll;
dt:Ist_drehzahl[i] = ist;
dt:Maschinenleistung[i] = 100*ist/soll;
));
));
));
回覆:非常慢的循環行為@vince_faller涼爽的! 我只看到速度提高了大約 10 倍(這仍然非常驚人。)我懷疑這種加速與開始/結束資料更新無關,但我也認為矩陣分配將在內部執行類似開始/結束資料更新的操作。
@EvanMcCorkle
回覆:非常慢的循環行為謝謝,可能(請參閱上面的評論,問題同時消失了)這就是原因,因為許多報告都是公開的。 但我現在無法重現。 我將在我的程式碼中介紹您的解決方案,看看它是否是永久修復。
貂回覆:非常慢的循環行為更新:我新增了 get rows where 查找行的方法。顯然,這有需要數字資料的限制,但我有時能夠解決這個問題。
我非常喜歡用矩陣來做一切事。
Names default to here(1);
dt = New Table("Test",
Add Rows(1000000),
New Column("Statusnummer", Set Each Value(Random Integer(0, 1))),
New Column("Drehzahl", Set Each Value(Choose(Random Integer(1, 2), ., Random Normal()))),
New Column("geschw", Set Each Value(Choose(Random Integer(1, 2), ., Random Normal()))),
New Column("SollDrehzahl", Set Each Value(Random Normal())),
New Column("Soll_drehzahl"),
New Column("Ist_drehzahl"),
New Column("Maschinenleistung"),
);
st = HPTime();
for(i=1,i<=NRows(dt),i++,
if(dt:Statusnummer[i] == 1,
if(!isMissing(dt:Drehzahl[i]) & !isMissing(dt:geschw[i]),
ist = dt:Drehzahl[i];
soll = dt:SollDrehzahl[i];
dt:Soll_drehzahl[i] = soll;
dt:Ist_drehzahl[i] = ist;
dt:Maschinenleistung[i] = 100*ist/soll;
);
);
);
t_loop = HPTime() - st;
st = HPTime();
m = dt[0, {"Statusnummer", "Drehzahl", "geschw"}]; // makes a matrix
//check the matrix
v = m[0, 1] // don't need to do a check if it's 0 or 1
&
!ismissing(m[0, 2]) // check if drehzahl is missing
&
!ismissing(m[0, 3]); // check if drehzahl is missing
rows = loc(v); // this is the rows you want to do stuff on now.
//now just set all at once
soll = dt[rows, "Soll_drehzahl"] = dt:SollDrehzahl[rows]; // assign the rows and variable simultaneously
ist = dt[rows, "Ist_drehzahl"] = dt:Drehzahl[rows]; // same thing
dt[rows, "Maschinenleistung"] = 100 * ist :*</img> (1/soll); // do an element wise matrix division
t_mat = HPTime() - st;
st = HPTime();
rows = dt << get rows where(dt:Statusnummer == 1 &
!Is Missing(dt:Drehzahl) &
!Is Missing( dt:geschw ));
//now just set all at once
soll = dt[rows, "Soll_drehzahl"] = dt:SollDrehzahl[rows]; // assign the rows and variable simultaneously
ist = dt[rows, "Ist_drehzahl"] = dt:Drehzahl[rows]; // same thing
dt[rows, "Maschinenleistung"] = 100 * ist :*</img> (1/soll); // do an element wise matrix division
t_get_where = HPTime() - st;
show(t_loop, t_mat, t_get_where);
當我進行這個比較時,我得到了
t_循環=11259288;
t_mat = 206942;
更新
t_loop = 11950585;
t_mat = 205366;
t_get_where = 6742823;
回覆:非常慢的循環行為這可能會加快速度 - 將循環限制為僅滿足條件的行。
found_rows = dt << get rows where(dt:Statusnummer == 1 &
!Is Missing(dt:Drehzahl) &
!Is Missing( dt:geschw ));
for (i = 1, i <= nrows(found_rows), i++,
k = found_rows[i];
dt:Soll_drehzahl[k] = dt:SollDrehzahl[k];
dt:Ist_drehzahl[k] = dt:Drehzahl[k];
dt:Maschinenleistung[k] = 100 * dt:Ist_drehzahl[k] / dt:Soll_drehzahl[k] ;
);回覆:非常慢的循環行為也許您還有另一個開啟的報告,並且正在針對您對錶所做的每項變更進行更新。 您可以在循環之前和之後執行此操作:
dt << Begin Data Update;
// the loop
dt << End Data Update;
回覆:非常慢的循環行為|嗨羅恩,謝謝。 嵌套循環旨在使其更快,
因為第一個條件在很多行都失敗了,這樣循環就可以
(並且確實)使用下一行從頂部開始。所以從功能上來說
一切正常。 然而,我重新檢查了一下,速度變慢了。 在裡面
在偵錯器中,資料表存取寫回值花了很長時間:
dt:Soll_drehzahl[i] = soll; dt:Ist_drehzahl[i] = ist;
dt:Maschinenleistung[i] = 100*ist/soll;|
所以我把它們註解掉了 (//) ==> 結果:非常快
我刪除了註釋標記(//)並且......仍然非常快(!)
……(相同的程式碼,相同的結構,......)
現在它可以工作了,但我仍然不知道是什麼導致了這個問題。 或許
我的系統中的某些內容已損壞。
感謝您的建議。
回覆:非常慢的循環行為你好@MWalther
我會嘗試按照傑夫建議使用列公式來做到這一點。不要忘記,一旦您不希望不斷地重新評估公式,您可以隨時刪除公式或只是抑制它們的評估。
如果你堅持使用 for 迴圈方法,我會先看看最後幾個分號是否是必要的。
此外,我會嘗試將嵌套的 if 語句簡化為一個較長的條件清單。
最後,在子樣本上使用偵錯器,看看循環中的哪些內容需要花費更多時間。 我有一種感覺,大部分時間都在做一些無意識的事情。
如果有任何改進請告訴我們。
回覆:非常慢的循環行為親愛的傑夫,感謝您的回答。 腳本中該位置的公式
沒有幫助。 (這是我的排序和資料清理部分,我想要的地方
以避免公式)
我在不同的地方遇到同樣的問題。 還有一些公式
也受到了影響。
看來,這個過程幾乎完全凍結了(我數了1
行/秒!)儘管 CPU 繼續加載!
然而,一旦完成,結果是正確的。
你的貂
回覆:非常慢的循環行為您是否嘗試過使用以下命令在資料表中建立這些列公式編輯器而不是用 JSL 循環? 這可能會更有效率。