LabVIEW中"Memory is full"錯誤

更新 May 31, 2021

產品資訊

軟體

  • LabVIEW

問題敘述

在LabVIEW中開發大型應用程式時,有時會收到以下錯誤訊息:

LabVIEW: Memory is full.

The top-level VI was stopped on the block diagram.

Refer to the VI Memory Usage topic in the LabVIEW Help for suggestions on monitoring and improving VI memory usage.


Error
Not Enough Memory to complete this operation.


我有大量可使用的RAM,為什麼會收到此錯誤訊息?

 

解決方案

通常會在開發具有大型資料集的array,cluster或waveform的應用程式時,遇上此錯誤消息。由於LabVIEW將每個資料集存儲在一個連續的記憶塊中,因此電腦上可用的記憶塊可能不足以存儲大資料集。而另一個可能性是許多引用被打開後並沒有正確關閉。
 

以下是一些幫助防止出現此錯誤訊息的建議:

減少array,cluster和waveform使用的記憶體

  • 如果您的array中的資料集較大,則盡可能使用較小的數據類型來呈現array中的item。例如,如果array中的item用雙精度浮點數(DBL)呈現,但是可能的期望值範圍限制為0到100之間的整數,則可以更改以unsigned 8-bit integers(U8)呈現。 U8 integers數據類型所占用記憶體是DBL數據類型占用記憶體的八分之一。
  • 在LabVIEW 8.5及更高版本中,請使用In Place Element Structure以避免在使用array,cluster或waveform時復制數據。
  • 如果要繪製來自大型array的數據,請使用max-min decimation來避免繪製每個數據點。
  • 使用Profile Performance and Memory可幫助縮小範圍並確定哪些VI與記憶體使用相關
  • 分析大型資料集以確定記憶體已滿的位置。將數據串流式傳輸或寫入硬碟,並使用高性能的分析和報告工具,例如TDMS文件和NI DIAdem軟體。

 

減少應用程式中的記憶體使用量

  • 要限制LabVIEW複製數據的次數,請減少應用程式中global變數和local變數的數量。與其使用變數,建議使用生產者/消費者設計模式New Data Value Reference功能來創建對數據的引用。
  • 將大部分程式碼分成數個subVI,然後使用 Call By Reference Node可動態調用subVI。直到VI動態調用subVI為止,subVI才占用記憶體。
  • 盡可能將較大的subVI設置為non-reentrant。 Windows和Real-Time VI的默認設置為non-reentrant。
  • 使用NI LabVIEW Desktop Execution Trace Toolkit來識別可能影響性能的問題,例如記憶體洩漏和引用洩漏。該套件還可以收集低层訊息,例如call chain,thread ID和追蹤虛擬記憶體中的位置,以及配置檔VI,執行檔和shared libraries。
  • 降低Front panel物件的polling rate。如果要盡快刷新waveform graphs,則可能會佔用大量記憶體。將polling rate降低到用戶可接受的數量。

 

增加LabVIEW記憶體

關閉LabVIEW中的引用
  • 當您打開對應用程式,專案,VI或其他參考源的引用時,LabVIEW會分配記憶體來存儲該引用。要釋放LabVIEW存儲參考源的記憶體空間,必須關閉引用。您可以在LabVIEW中關閉引用閱讀更多有關訊息。

相關資訊

如果LabVIEW無法為array分配足夠大的存儲塊,則該錯誤訊息最常見。例如,大小為2,000 x 2,000個的雙精度浮點數的2D array使用大約32 MB。即使有32 MB記憶體可用,您也可能沒有足夠大的連續存儲塊供array使用。

當包含多於2 ^ 31個元素的array用於索引For循環時,也會生成此錯誤訊息。array最多可以包含2 ^ 32個元素,但是For循環最多只能索引2 ^ 31個值。這是因為N端口使用signed 32-bit integers(I32)數字數據類型,而不是使用unsigned 32-bit integers(U32)數據類型。 I32數據類型的最高有效位用於指定該值是正數還是負數。要解決此限制,您可以將array拆分為兩個較小的array,或者用While循環替換For循環,將iteration值與array的大小進行比較,並在兩者相等時終止。