釋放記憶體

想請教一下"show buffer allocation"這一個功能如何開啟?

我找不到位置QQ

[QUOTE=艾爾]

想請教一下"show buffer allocation"這一個功能如何開啟?

我找不到位置QQ

[/QUOTE]

在 「Tools -> Advanced -> Show Buffer Allocations 」

 

[QUOTE=yao]

Jimmy-Chen說的我想一般有程式經驗的人大概會了解
只是我和Airbolt一樣,很訝異為什麼差一個indictor會造成這樣的差異![](upload://qPCmzfq2KigUaPncn6Um67RUCob.gif)

[/QUOTE]

嗯!
這是最難理解的地方,不知道是什麼原因造成的,
也是我最想知道的部分。

我還是不懂show buffer allocation怎麼用!?假設我已經寫好一個程式,執行show buffer allocation然後呢?

我猜  

那一個indictor把資料限制在記憶體某區域,而不是讓程式自己去規劃,所以它就乖乖的不多吃記憶體了,這樣有道理嗎?

只是猜的  我很弱

大大,我執行些程發現錯誤,缺少"empty subvi.vi",不知在哪可以找到…

[QUOTE=skyatholuo]大大,我執行些程發現錯誤,缺少"empty subvi.vi",不知在哪可以找到.....[/QUOTE]

抱歉,之前傳錯了,現在下載就可以了:

7.1版:Memory Allocation Dots.llb

[QUOTE=火火火]

我猜  

那一個indictor把資料限制在記憶體某區域,而不是讓程式自己去規劃,所以它就乖乖的不多吃記憶體了,這樣有道理嗎?

只是猜的  我很弱

[/QUOTE]

我覺得 火 火 火 說的滿有道理,
只是不知道有哪位版友可以幫忙証實一下
真實的原因是什麼?

這個問題困惑很久了,
雖然知道有這個方法,
可是在不知其所以然的情況下,
還是無法應用在自己寫的程式之上。

![](upload://qPCmzfq2KigUaPncn6Um67RUCob.gif)倘若我使用這個方式在我的程式上~並做即時存取!會不會提高LABVIEW的處理速度!

還是說操過幾萬筆資料後

就因此變的越來越慢?

嗨~老話重提會不會太老舊~
最近也在寫跟yao兄之前一樣處理數據的程式~
也是跑一跑就盪掉~
目前是知道存檔後的array過大而造成記憶體爆掉~
後來改寫先存第一步資料再叫回處理第二步就OK~但還是在測試中

~不知道這個兩年前的話題到今天~各位有沒有新的見解呢?~

跟BOSS討論~說要想好資料流~不能狂操電腦的記憶體~哈哈~
我的確太過依賴電腦的能力了~所以最初寫的程式很累贅~撰寫方式瘦身中~

[QUOTE=Airbolt][QUOTE=艾爾]

想請教一下"show buffer allocation"這一個功能如何開啟?

我找不到位置QQ

[/QUOTE]

在 「Tools -> Advanced -> Show Buffer Allocations 」

 [/QUOTE]

這個議題幫了現在的我很多忙,準備被我Write到AO而被預存在記憶體裡面的資料,約有1 MB~10 MB的資料

目前我使用的是2013(32-bit),要找到此工具順序為:Tools>>Profile>>Show Buffer Allocations


資料來源如下:

http://labviewwiki.org/Buffer_Allocation

There is a tool in LabVIEW called the "Show Buffer Allocations" tool. You can find it in a VI's menu at Tools>>Profile>>Show Buffer Allocations.... It is a useful tool for doing memory optimizations because it shows little dots every place that the LabVIEW compiler made a buffer allocation. Some people call these "copy dots" because people *think* these indicate where LabVIEW is making a copy of the data. 


[QUOTE=Benjamin][QUOTE=jimmy-Chen]

如果先規劃一個記憶體區塊,來放置載入的資料呢?

不知道是不是可以解決這個問題?![](upload://jmG3LQlF5SuLT7HrfVzYrp9QfUn.gif)

[/QUOTE]

在LabVIEW7.1的研討會中,有提到運用「事先規劃一塊記憶體來存放資料,會節省許多系統資源」,附加檔如下:

執行的結果如下圖所示,如果有事先規劃記憶區塊,只花4ms,如果沒有事先規劃記憶區塊,則要花費1578ms,相差394.5倍

![](upload://i0xzoy4xLtxwRCrGrEpdCDmQFwj.jpeg)

[/QUOTE]

a. 11年後,LabVIEW 2013 (32-bit)的Buffer Allocations(小黑點)似乎變比較聰明,都是落在進迴圈前的Array Subset輸出端了,是否是LabVIEW有改進此部分編譯能力 (不確定)。

b. 另一方面,可能因為電腦速度加快,Iteration次數要約增加到100倍的750000,才會看得出時間差異 約91ms與172ms。

c. 我不斷增大Iteration的次數(1000倍與10000倍),兩個迴圈消耗時間雖然上升,但仍維持呈現後者約是前者的2倍。這個現象,是否代表著正確地預先分配記憶體雖然有改善,但預先分配還是能省下小小一筆時間。後者在迴圈裡還是會多做一些事。當迴圈裡只做一點點事時,多做一個小動作,佔掉的時間就幾乎要消耗為兩倍。

d. 另外,現在的LabVIEW有個呼叫SubVI時可使用的指令,Request Deallocation Function,是否能夠幫助到原先提問者的記憶體空間問題呢

e. 如果測試操作有誤,麻煩不吝指正,我只是個入門者 @@

![](upload://2r8rg1hQhRSmjMQmP0N8cW2kRgb.png)

我的答案跟你們的不一樣怪了! 還有 圖片加浮水印  有問題



我想你抓到它了,「這個測試程式本身就是有問題的」,今天寫公司的程式的時候正好碰到完全一樣的issue才想懂,回頭要來貼360,已經被你把問題抓出來了
簡單來說,按下逐步執行燈泡,啟動程式,注意每一個Timer的Tick Counts(ms)的給值時間,就會知道為什麼兩倍了...,不是我亂推測的那些原因![](upload://fwLdedPZdXLjZyCWa7zyAqECATM.gif)

相關資訊如下:
a. 你的電腦比我快,我的Iteration 75000 costs ~90 ms,你的Iteration 900000 costs ~90ms
b. 你的LabVIEW也是2013,所以我們沒有直接測試到原先的Buffer Allocation Issue,但是你抓出了測試程式的問題
c. 這個程式啟動的瞬間就已經紀錄了兩個迴圈的Timer的被減數。如果前後迴圈時間都差不多,當然執行完第二組約略就是要花掉兩倍的時間,而且第二組時間甚至略短。
d. 剩下的問題是,當年(2004年)的時候沒有LabVIEW 2013的,凡測出兩倍的都是Timer造成的效果,但是數百倍的差距需要小黑點不同的版本才能測
  • 事先規劃一塊記憶體來存放資料,會節省許多系統資源

執行的結果如下圖所示,如果有事先規劃記憶區塊,只花4ms,如果沒有事先規劃記憶區塊,則要花費1582ms,相差395.5倍

這個部分要如何重現呢?

當年的討論板友yao有提到「還有第二個loop應該是1582-4=1578ms才對」,代表他有注意到Timer的問題
Airbolt有提到「甚至將左右兩邊的程式碼,拆解分開執行,結果還是如 Benjamin 所說的一樣」,他也有注意到Timer的問題
另外還有用Notifier Operations的Jimmy-Chen。也就是說,我對於兩倍怎麼來的真的沒跟上,囧...![](upload://fwLdedPZdXLjZyCWa7zyAqECATM.gif)


如果是這樣的話,我會推測舊版本到新版本之間,已經把Buffer Allocation Issue修過了。從前面參與測試板友的反應來看,過去版本的延遲問題應是真的存在,以配置事前記憶體的方式(如Obtain Notifier Function都可以改善,但現在2013標準操作已經重現不出問題來了。甚至後面的迴圈部分執行起來可能會比前面的還快。

另外,Obtain Notifier Function有幫助到我的程式同步化的需求,在這邊感謝lordtseng與各位前輩了


[QUOTE=lordtseng]我的答案跟你們的不一樣怪了! 還有 圖片加浮水印  有問題

![](upload://krW7Z9MvPdkVwWBHMQNbJpT5gCK.png)
[/QUOTE]MingYen42199.7277546296

精彩的討論,來頂一下,另外,會不會NI看到這討論串後,改善記憶體配置方法,因此原問題無法重現。(哈,我亂猜的~