LabVIEW可以在程式中釋放掉記憶體嗎?
因為只要一載入幾MB以上的資料,LabVIEW就變的好慢
應該是資料都暫存在structure的tunnel上了
LabVIEW可以在程式中釋放掉記憶體嗎?
因為只要一載入幾MB以上的資料,LabVIEW就變的好慢
應該是資料都暫存在structure的tunnel上了
如果先規劃一個記憶體區塊,來放置載入的資料呢?
不知道是不是可以解決這個問題?
要如何先規劃呢 ? 先規劃就可以釋放掉嗎 ? 可以請Jimmy-Chen稍微再講詳細一點,對於一些進階的技巧我還不了解
不知道目前大家載入過最大的資料量是多少
我才載入4MB的資料分析,就有夠慢的了
如果我把更大量的資料載入
那我現在做的系統跟本就無用武之地嘛
我覺得需要一步一步解決。我覺得首先要看看你的這個程式主要是做什麼。如果你的程式的主要功能是儀控,那麼我們最好不要較城市做 太多的計算動作,否則,跑一個迴圈的時間會拖很久。如果你的程式主要不是做儀控,而是做計算之類的,那就還好,那就要試著使得程 式執行的更有效率。
兩種情況:
我覺得,要一個程式很快,又可以做很多計算,是不可能的。有利必有弊,我們不是要完全將弊刪除,只留下利,因為那是不可能的。
所以,yao,你的程式有做儀控嗎?還是純粹分析呢?因為你剛剛說你載入4MB的資料分析。
我的程式沒有儀控的部份,分析其實運算式也不會很複雜,分析量以後可能不用有4MB那麼大,但是也不確定,只是剛好載入4MB的 資料就覺得很慢,怕以後給人使用時,載入更大量的資料就慘了
現在想想,LabVIEW應該還是在儀控上有優勢,要做成其他系統還真的是有點慢
如果你是怕給人不好的感覺,比如說:感覺慢。那麼你可以做一些像是:進度bar,之類的東西可以藉此分散使用者的注意力。
我覺得,不建議在儀控的時候童是做很複雜的計算,做簡單的計算是還好。複雜的計算留到「非儀控」的時候,再來做複雜的計算。
此外,如果覺得使用C來做計算比較快的話,建議可以用C來做計算,寫C的程式,再用LabVIEW來call就可以了。
嗯…看來也是只能這樣做,等以後再用c來做吧,功能先做出來再說
我認為你可以把你的程式,劃分成許多Subvi,普通的寫法是把Subvi直接寫在主程式內,但是你可以藉由一個指令Call by reference Node,這指令也是Subvi呼叫的一種,但是他是以檔案形式為路徑,他你執行完這vi會主程式會將這vi關閉(同等於是放記憶體),等到你有用到該功能後在去該路徑尋找後打開執行,
真正佔用你電腦效能頂多是開啟該檔案瞬間而已,比起你持續開著該檔案來的有效率喔。
我之前原本樣做這方面詳細說明,目前工作量又加大了。
你講的我知道,不過我現在不是這個問題,如果你用了任一種structure,不管使用tunnel或者是register,資 料都會暫存在上面,所以你才可以做到資料的傳遞,但是我發現,即使程式的tunnel回到你給的啟始值,記憶體仍然不會釋放掉, 所以如果一次載入大量的資料,也就是每跑一次迴圈,這些資料就跟著轉一次,應該是這樣造成lag的原因
很好奇你載入的資料型態為何呢??迴圈上的資料流會達到幾MB??可以的話略為描述一下您的架構…我之前寫了一個計算 產品壽命(MTBF)的程式, 從產品BOM表載入零件約700~2.3千筆資料, 且程式中載入約有兩百多個subvi, 其中有168個是用來作運算的vi(一堆指數.對數運算…), 整體程式約12MB, 執行上基本上不會有什麼lag的情況阿…載入資料. 運算. 每個步驟都在一秒左右可以完成吧!!所以…經驗上若沒有作儀器控制, 迴圈運算再一兩百個應該都可以很順暢才是阿…
其實跟資料型態無關吧,因為我載入MIT的ECG-DB,每一個檔案大約就有2MB,一次載入兩個,當我每改變一些數值或者游標 ,這些data就要作一些處理,所以這些data就要跑到不同的case或者loop內,系統沒有在作運算時,當然還算ok,不 過遊標隨便拉一拉,可能瞬間就要做好幾次運算,系統就lag的不得了
[QUOTE=jimmy-Chen]
如果先規劃一個記憶體區塊,來放置載入的資料呢?
不知道是不是可以解決這個問題?
[/QUOTE]
在LabVIEW7.1的研討會中,有提到運用「事先規劃一塊記憶體來存放資料,會節省許多系統資源」,附加檔如下:
執行的結果如下圖所示,如果有事先規劃記憶區塊,只花4ms,如果沒有事先規劃記憶區塊,則要花費1578ms,相差394.5倍:

其實我不太了解耶,為什麼放個indictor算是規劃一塊空間
在一開始initialize array時,應該就規劃好啦
如果是這樣,那兩個loop應該沒有差別
這個例子真神奇,我完全不知道有這樣大的差別
還有第二個loop應該是1582-4=1578ms才對
[QUOTE=yao]
還有第二個loop應該是1582-4=1578ms才對
[/QUOTE]
恩...你說的沒有錯...我去更正...
我改了一下程式,利用Notifier Operations先進行記憶體區塊的配置,效果是一樣的.
誰知道程式中該如何判斷何處需進行記憶體配置??似乎加錯地方也沒有用耶!!
多多討論吧...記憶體的管理對程式設計來說是挺重要的呢!
如果陣列大於10k以上時速度算正常,50k以上的陣列速度會變慢,100k以上的資料電腦速度會以每提昇的數值拖累電腦速度,使正常功能的計時器變樣,不會以正常速度執行,
所以大約存50k就要把記錄存在資料夾裡,然後把陣列消除,這樣比較不會影想電腦抓取數度,這個是使用單點抓
如果試用表單跟記憶體可以用其他方式來儲存可達到100k以上的儲存方式來存檔,在消除,千萬不要在程式裡跑,否則電腦會死當給你看
然後低速的頻率可以用你的方式,高頻的方式不能用這樣喔
[QUOTE=Benjamin]
在LabVIEW7.1的研討會中,有提到運用,附加檔如下:
執行的結果如下圖所示,如果有事先規劃記憶區塊,只花4ms,如果沒有事先規劃記憶區塊,則要花費1582ms,相差395.5倍:
[/QUOTE]
一開始看了 Benjamin 所貼上的圖例,覺得應該執行效率是一樣的,
但是下載了範例程式執行之後,發現果真如此。甚至將左右兩邊的程式碼,拆解分開執行,
結果還是如 Benjamin 所說的一樣。真的是大大顛覆了原有的想法。
於是用 LabVIEW 7.1 的 Buffer 分析工具來看,
發現在有著底下圖例的差異。
(抱歉,因為家裡沒有安裝 LabVIEW 所以沒辦法真的貼上真實的
分析圖例給大家看。)在橘色框選的部分,是兩邊程式碼唯一不同的記憶體重新配置的地方,
如果依照分析工具所示,在橘色的部分
右邊的程式碼將會進行 7500 次的記憶體重新配置的動作,
而左邊的程式碼將只會在迴圈外進行 1 次的記憶體重新配置的動作。只是相差了一個 Indicator 就有這麼大的差異,真的是很難理解。
這邊想請教 Benjamin 或其它了解原因的人解說一下,
會造成這麼大影響的原因是為何?
還有「事先規劃一塊記憶體來存放資料,會節省許多系統資源」的規則為何?
謝謝。ps: 請教 yao 一下,你所提到的「structure的tunnel」是指?

我的想法是這樣:
如果事先規劃出記憶體區塊,就只要把參數依序放進所配置的區塊裡.而不需要重複進行規劃記憶體的動作.
但是,如果沒有進行記憶體區塊的配置,就必須先執行規劃記憶體區塊的動作,再將參數丟到所規劃的記憶體區塊內.
例如有一10 elements長度的1DArray,要依序放進參數值.
如果有事先配置記憶體區塊,那麼配置記憶體動作只要進行一次,後續只要將參數依序放進記憶體區塊中.
反之,若沒有事先進行記憶體區塊配置,在每次要將參數依序放進記憶體區塊前,就必須先進行一次記憶體區塊配置動作,決定這個element要放在哪裡.而且會連前面的記憶體區塊重新進行配置.
大概是這樣吧,因為在其他的程式語言裡(如MATLAB),也有這方面的討論.
Jimmy-Chen說的我想一般有程式經驗的人大概會了解
只是我和Airbolt一樣,很訝異為什麼差一個indictor會造成這樣的差異