新聞中心

EEPW首頁 > 測試測量 > 設計應用 > 大量數據的內存管理

大量數據的內存管理

作者: 時間:2017-01-09 來源:網絡 收藏
LabVIEW自動處理內存分配。因為該過程是自動的,LabVIEW在處理數據時必須注意數據的安全性。這就意味著LabVIEW需時常備份數據。如程序需處理大量數據,大量的數據副本可能會導致內存溢出錯誤。使用下列規(guī)范避免內存問題,優(yōu)化程序以處理大量數據。
注:也可使用記錄性能和內存信息窗口,獲取和顯示VI執(zhí)行事件和內存使用的數據。使用該窗口確定引發(fā)內存問題的VI。

減少大量數據的數據副本

LabVIEW是一種數據流語言,VI需要更多數據時(例如,數據連線分出兩條支路),LabVIEW會創(chuàng)建數據副本。大多數情況下LabVIEW能檢測是否需要創(chuàng)建一個新的副本,當不確定是否需要數據副本時,LabVIEW仍然會創(chuàng)建新的數據副本。

本文引用地址:http://butianyuan.cn/article/201701/337247.htm

使用顯示緩沖區(qū)分配窗口確定LabVIEW分配內存的位置。該窗口確定LabVIEW用于存放數據副本的數據緩沖區(qū)。

請按照下列規(guī)范編寫程序,以減少LabVIEW創(chuàng)建的數據副本:

注:下列技巧中有些與良好的LabVIEW編程慣例不一致,這些技巧只在處理海量數據時使用。
  • 使用占用資源較小的數據類型。例如,使用16位整型數據,而不是雙精度浮點數。
  • 使用簡單數組。當從波形或動態(tài)數據提取數據數組時,LabVIEW會為數據建立額外副本。
  • 創(chuàng)建大程序框圖。調用子VI時,LabVIEW會創(chuàng)建數據副本。
  • 數據流經子VI時,請確保所有程序框圖接線端均在條件結構或循環(huán)之外。如接線端在條件結構或循環(huán)中,LabVIEW將會產生越來越多的數據副本。
  • 如請不要將數據連接至循環(huán)內。如要將數據連入循環(huán),可使用移位寄存器。LabVIEW只在第一次循環(huán)時復制一個數據副本。如使用隧道,每次循環(huán)時,LabVIEW都會創(chuàng)建數據副本。
  • 如有可能,使用必須連接的輸入。產生默認值時,LabVIEW將會創(chuàng)建數據副本。
  • 使用元素同址操作結構,而不是平鋪式順序結構。
提示:較新版本的LabVIEW比早期版本自動復制更多數據副本。版本越新,LabVIEW處理大量數據的功能就越好。

傳輸大量數據

如不能避免創(chuàng)建大量數據副本,可減少每個副本的大小。傳輸時,將大量數據分為若干部分,即數據塊策略。數據分塊時,LabVIEW創(chuàng)建的副本對內存使用沒有負面影響。但是,這些副本對數據吞吐率還是有負面影響,所以,仍建議最小化這些副本。下例證明了這個概念。

需復制512 MB數據至磁盤。一次調用就可獲取所有數據并將數據保存至磁盤。但是,即時將數據副本減少為1,仍需傳輸原始數據和一個數據副本。這意味著要向LabVIEW要求1 GB的內存。更好的方法是建立一個循環(huán),一次獲取500 KB的數據并流盤。內存占用減少為1 MB,500 KB用于原始數據,500 KB用于數據副本,這在大多數計算機的內存容量之內。

優(yōu)點是節(jié)省了LabVIEW分配大量內存所需的海量時間。在多數計算機上,250 MB數據的流盤時間不超過15秒。如按照其它方法,LabVIEW分配1 GB RAM的時間很可能超過15秒。

如將大量數據流盤或存儲在冗余磁盤陣列(RAID)中,也可不通過緩沖區(qū)傳輸數據,以減少數據副本,加快數據傳輸。如要禁用緩沖區(qū),將TRUE值連接至打開/創(chuàng)建/替換文件函數的禁用緩存輸入端。

顯示大量數據

在許多交互式應用程序中,唯一對數據進行的操作是顯示數據。顯示500萬個數據點超出了大多數顯示器的顯示能力。LabVIEW圖片的寬度一般在300-1000像素。500萬個點超過了波形圖實際顯示點數三個數量級。所以,需大量減少數據點。

例如,在圖形上看到精確至像素的大量數據。如一個500萬點緩沖區(qū)中有一個突波,繪制出的圖形應該是一條水平線,上有一個一像素的突波。如果數據是一個正弦波,其周期數大于屏幕的像素寬度。圖形應該是一個不間斷的頻帶,且無混疊。最大值最小值截取算法可解決上述兩個問題。

最大值最小值截取算法是在每個截取區(qū)間內給出一個最大值和一個最小值,以截取部分數據。簡單截取使用每個截取區(qū)間的第一個數據點作為截取區(qū)間的數據點。簡單截取將會導致混疊,所以只能在時間緊迫,精度相對不重要的情況下使用該算法。

使用最大值最小值截取算法的第一步是確定圖形的像素寬度。使用圖形的繪圖區(qū):大小:寬度屬性,找到該項。每個像素寬度至少需兩個截取區(qū)間。將像素寬度乘以2,獲得區(qū)間數量,然后將數據除以區(qū)間數量,從而降低算法誤差。將數據長度除以這個數,向最近數取整。得到的是截取的數據塊大小。對于每個數據塊,找到最大和最小點,并將其按照在數據集合中的順序排列。不必擔心最后一個數據塊的數據點比其它數據塊的少。問題在于小于像素寬度,在屏幕上不可見。將所有最大值和最小值數據連接起來,然后繪制這些數據。屏幕上每個像素寬度上有四個點。這樣,即使有一個像素寬度的突波,周圍的像素也不會受影響。最大值最小值截取法保證了永遠可以看到數據的峰值,顯示高頻率正弦波產生的不間斷頻帶。繪制到圖形的數據較少,繪制的速度就更快。

在下圖中,如使用最大值最小值截取算法處理左邊的數據,LabVIEW將生成右邊的圖表。

存儲大量數據

使用隊列或數據值引用在內存中存儲大量數據,而無需占用大量內存。使用包含數據的單個元素創(chuàng)建一個隊列。要訪問數據時,可拆散隊列。這使程序的其它部分不能同步訪問某個數據。對數據操作完成后,將元素重新排入隊列。要傳遞的唯一對象是隊列的引用。傳遞隊列時,LabVIEW不創(chuàng)建額外的數據副本。給隊列命名后,可在任何時候使用獲取隊列函數獲取隊列引用。創(chuàng)建多個數據對象與創(chuàng)建多個隊列一樣容易。

還可使用數據值引用存儲數據,不創(chuàng)建額外數據備份。數據值引用比隊列速度更快,但是沒有超時選項??蔀閿祿?chuàng)建引用并傳遞引用,而不是傳遞數據至隊列。如要對數據進行操作,可使用元素同址操作結構。數據值引用寫入/讀取元素邊框節(jié)點接受數據值引用輸入,用戶可在元素同址操作結構中操作數據并替換原內存中的數據。

注:可在類屬性對話框的繼承頁上設置只有LabVIEW類的成員VI才可創(chuàng)建類的數據值引用。

也可使用功能全局變量在內存中存儲大量數據。使用功能性全局變量,LabVIEW將在數據塊中保存和訪問數據。這樣,不需大量內存就可以傳輸數據。未初始化的移位寄存器可用來保存數據。使用數組函數讀取、寫入和重新調整數據。數組函數按順序排列數據,不會創(chuàng)建數據副本。該方法通常比隊列方法慢。



關鍵詞: 大量數據內存管

評論


技術專區(qū)

關閉