From Friday, April 19th (11:00 PM CDT) through Saturday, April 20th (2:00 PM CDT), 2024, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.



使用函數全域變數處理陣列資料時如何避免佔用多份記憶體空間?



主要軟體:
主要軟體版本: N/A
主要軟體修正版本: N/A
次要軟體: N/A

問題: 我在程式中使用ㄧ個陣列資料型態,執行時希望這個陣列資料只在記憶體佔有一份空間。我知道可以使用移位暫存器以及"Replace Array Subset"使陣列資料在記憶體只佔一份空間,但我希望同時可以結合函數全域變數這個功能。因為在使用函數全域變數中,不能初始化移位暫存器,所以需要一個方法可以做初始化的動作。如果使用"Initialize Array",陣列資料就會在記憶體佔用額外的空間。

解答:

下面有一個範例可以用來觀察陣列資料在記憶體的配置方式:

1) 關閉所有已開啟的VI,但是不關閉LabVIEW。
2) 開啟下方附件範例"Two Copies in Memory.vi",但是先不要做執行的動作。
3) 打開Windows的工作管理員,同時觀察LabVIEW執行時所佔用的記憶體數目。
4) 以預設的設定值執行範例程式,可以觀察到記憶體的使用增加了20 Mb。在預設的陣列大小設定下,會產生1276900個8位元長度的雙浮點數,其總容量為10 Mb。由於這個陣列在記憶體有兩份空間,所以記憶體的總使用量為20 MB。

另一個觀察記憶體使用空間的方法是開啟LabVIEW中的buffer allocations window,其位於Tools » Advanced » Show Buffer Allocations。從程式區中你可以看到一份記憶體空間是屬於移位暫存器而另一份是屬於"Initialize Array.vi"。

如果要指定陣列的型態,可以使用"Reshape Array.vi"來代替"Initialize Array.vi"。利用這個方法,可以永遠都只用既存的陣列資料來做相對應的程式運算而無須再替陣列資料創造第二份記憶體空間。

要實現上述的方法,可以參照下面的範例:
1) 關閉所有已開啟的VI,但是不要關閉 LabVIEW。
2) 開啟附件範例程式"One Copy in Memory.vi",但先不要做執行的動作。
3) 打開Windows的工作管理員,同時觀察LabVIEW執行時所佔用的記憶體空間。
4) 使用預設的設定值執行範例程式,可以觀察到記憶體的使用空間只增加10 Mb。在這個範例中,資料陣列只在記憶體佔有一份空間。

也開啟LabVIEW中的buffer allocations window,位於Tools » Advanced » Show Buffer Allocations。從程式區可以看到只有一份陣列記憶體空間,且其屬於移位暫存器。



相關連結:
KnowledgeBase 2T9ICKTL: How Can I Optimize the Memory Use in My LabVIEW VI?


附加檔案:


Two Copies in Memory.vi - Two Copies in Memory.viOne Copy in Memory.vi - One Copy in Memory.vi


報告日期: 04/07/2005
最後更新: 12/28/2011
文件偏號: 3K6D44AU