大量數(shù)據(jù)的內(nèi)存管理
注:也可使用記錄性能和內(nèi)存信息窗口,獲取和顯示VI執(zhí)行事件和內(nèi)存使用的數(shù)據(jù)。使用該窗口確定引發(fā)內(nèi)存問(wèn)題的VI。 |
減少大量數(shù)據(jù)的數(shù)據(jù)副本
LabVIEW是一種數(shù)據(jù)流語(yǔ)言,VI需要更多數(shù)據(jù)時(shí)(例如,數(shù)據(jù)連線(xiàn)分出兩條支路),LabVIEW會(huì)創(chuàng)建數(shù)據(jù)副本。大多數(shù)情況下LabVIEW能檢測(cè)是否需要?jiǎng)?chuàng)建一個(gè)新的副本,當(dāng)不確定是否需要數(shù)據(jù)副本時(shí),LabVIEW仍然會(huì)創(chuàng)建新的數(shù)據(jù)副本。
本文引用地址:http://m.butianyuan.cn/article/201701/337247.htm使用顯示緩沖區(qū)分配窗口確定LabVIEW分配內(nèi)存的位置。該窗口確定LabVIEW用于存放數(shù)據(jù)副本的數(shù)據(jù)緩沖區(qū)。
請(qǐng)按照下列規(guī)范編寫(xiě)程序,以減少LabVIEW創(chuàng)建的數(shù)據(jù)副本:
注:下列技巧中有些與良好的LabVIEW編程慣例不一致,這些技巧只在處理海量數(shù)據(jù)時(shí)使用。 |
- 使用占用資源較小的數(shù)據(jù)類(lèi)型。例如,使用16位整型數(shù)據(jù),而不是雙精度浮點(diǎn)數(shù)。
- 使用簡(jiǎn)單數(shù)組。當(dāng)從波形或動(dòng)態(tài)數(shù)據(jù)提取數(shù)據(jù)數(shù)組時(shí),LabVIEW會(huì)為數(shù)據(jù)建立額外副本。
- 創(chuàng)建大程序框圖。調(diào)用子VI時(shí),LabVIEW會(huì)創(chuàng)建數(shù)據(jù)副本。
- 數(shù)據(jù)流經(jīng)子VI時(shí),請(qǐng)確保所有程序框圖接線(xiàn)端均在條件結(jié)構(gòu)或循環(huán)之外。如接線(xiàn)端在條件結(jié)構(gòu)或循環(huán)中,LabVIEW將會(huì)產(chǎn)生越來(lái)越多的數(shù)據(jù)副本。
- 如請(qǐng)不要將數(shù)據(jù)連接至循環(huán)內(nèi)。如要將數(shù)據(jù)連入循環(huán),可使用移位寄存器。LabVIEW只在第一次循環(huán)時(shí)復(fù)制一個(gè)數(shù)據(jù)副本。如使用隧道,每次循環(huán)時(shí),LabVIEW都會(huì)創(chuàng)建數(shù)據(jù)副本。
- 如有可能,使用必須連接的輸入。產(chǎn)生默認(rèn)值時(shí),LabVIEW將會(huì)創(chuàng)建數(shù)據(jù)副本。
- 使用元素同址操作結(jié)構(gòu),而不是平鋪式順序結(jié)構(gòu)。
提示:較新版本的LabVIEW比早期版本自動(dòng)復(fù)制更多數(shù)據(jù)副本。版本越新,LabVIEW處理大量數(shù)據(jù)的功能就越好。 |
傳輸大量數(shù)據(jù)
如不能避免創(chuàng)建大量數(shù)據(jù)副本,可減少每個(gè)副本的大小。傳輸時(shí),將大量數(shù)據(jù)分為若干部分,即數(shù)據(jù)塊策略。數(shù)據(jù)分塊時(shí),LabVIEW創(chuàng)建的副本對(duì)內(nèi)存使用沒(méi)有負(fù)面影響。但是,這些副本對(duì)數(shù)據(jù)吞吐率還是有負(fù)面影響,所以,仍建議最小化這些副本。下例證明了這個(gè)概念。
需復(fù)制512 MB數(shù)據(jù)至磁盤(pán)。一次調(diào)用就可獲取所有數(shù)據(jù)并將數(shù)據(jù)保存至磁盤(pán)。但是,即時(shí)將數(shù)據(jù)副本減少為1,仍需傳輸原始數(shù)據(jù)和一個(gè)數(shù)據(jù)副本。這意味著要向LabVIEW要求1 GB的內(nèi)存。更好的方法是建立一個(gè)循環(huán),一次獲取500 KB的數(shù)據(jù)并流盤(pán)。內(nèi)存占用減少為1 MB,500 KB用于原始數(shù)據(jù),500 KB用于數(shù)據(jù)副本,這在大多數(shù)計(jì)算機(jī)的內(nèi)存容量之內(nèi)。
優(yōu)點(diǎn)是節(jié)省了LabVIEW分配大量?jī)?nèi)存所需的海量時(shí)間。在多數(shù)計(jì)算機(jī)上,250 MB數(shù)據(jù)的流盤(pán)時(shí)間不超過(guò)15秒。如按照其它方法,LabVIEW分配1 GB RAM的時(shí)間很可能超過(guò)15秒。
如將大量數(shù)據(jù)流盤(pán)或存儲(chǔ)在冗余磁盤(pán)陣列(RAID)中,也可不通過(guò)緩沖區(qū)傳輸數(shù)據(jù),以減少數(shù)據(jù)副本,加快數(shù)據(jù)傳輸。如要禁用緩沖區(qū),將TRUE值連接至打開(kāi)/創(chuàng)建/替換文件函數(shù)的禁用緩存輸入端。
顯示大量數(shù)據(jù)
在許多交互式應(yīng)用程序中,唯一對(duì)數(shù)據(jù)進(jìn)行的操作是顯示數(shù)據(jù)。顯示500萬(wàn)個(gè)數(shù)據(jù)點(diǎn)超出了大多數(shù)顯示器的顯示能力。LabVIEW圖片的寬度一般在300-1000像素。500萬(wàn)個(gè)點(diǎn)超過(guò)了波形圖實(shí)際顯示點(diǎn)數(shù)三個(gè)數(shù)量級(jí)。所以,需大量減少數(shù)據(jù)點(diǎn)。
例如,在圖形上看到精確至像素的大量數(shù)據(jù)。如一個(gè)500萬(wàn)點(diǎn)緩沖區(qū)中有一個(gè)突波,繪制出的圖形應(yīng)該是一條水平線(xiàn),上有一個(gè)一像素的突波。如果數(shù)據(jù)是一個(gè)正弦波,其周期數(shù)大于屏幕的像素寬度。圖形應(yīng)該是一個(gè)不間斷的頻帶,且無(wú)混疊。最大值最小值截取算法可解決上述兩個(gè)問(wèn)題。
最大值最小值截取算法是在每個(gè)截取區(qū)間內(nèi)給出一個(gè)最大值和一個(gè)最小值,以截取部分?jǐn)?shù)據(jù)。簡(jiǎn)單截取使用每個(gè)截取區(qū)間的第一個(gè)數(shù)據(jù)點(diǎn)作為截取區(qū)間的數(shù)據(jù)點(diǎn)。簡(jiǎn)單截取將會(huì)導(dǎo)致混疊,所以只能在時(shí)間緊迫,精度相對(duì)不重要的情況下使用該算法。
使用最大值最小值截取算法的第一步是確定圖形的像素寬度。使用圖形的繪圖區(qū):大小:寬度屬性,找到該項(xiàng)。每個(gè)像素寬度至少需兩個(gè)截取區(qū)間。將像素寬度乘以2,獲得區(qū)間數(shù)量,然后將數(shù)據(jù)除以區(qū)間數(shù)量,從而降低算法誤差。將數(shù)據(jù)長(zhǎng)度除以這個(gè)數(shù),向最近數(shù)取整。得到的是截取的數(shù)據(jù)塊大小。對(duì)于每個(gè)數(shù)據(jù)塊,找到最大和最小點(diǎn),并將其按照在數(shù)據(jù)集合中的順序排列。不必?fù)?dān)心最后一個(gè)數(shù)據(jù)塊的數(shù)據(jù)點(diǎn)比其它數(shù)據(jù)塊的少。問(wèn)題在于小于像素寬度,在屏幕上不可見(jiàn)。將所有最大值和最小值數(shù)據(jù)連接起來(lái),然后繪制這些數(shù)據(jù)。屏幕上每個(gè)像素寬度上有四個(gè)點(diǎn)。這樣,即使有一個(gè)像素寬度的突波,周?chē)南袼匾膊粫?huì)受影響。最大值最小值截取法保證了永遠(yuǎn)可以看到數(shù)據(jù)的峰值,顯示高頻率正弦波產(chǎn)生的不間斷頻帶。繪制到圖形的數(shù)據(jù)較少,繪制的速度就更快。
在下圖中,如使用最大值最小值截取算法處理左邊的數(shù)據(jù),LabVIEW將生成右邊的圖表。
存儲(chǔ)大量數(shù)據(jù)
使用隊(duì)列或數(shù)據(jù)值引用在內(nèi)存中存儲(chǔ)大量數(shù)據(jù),而無(wú)需占用大量?jī)?nèi)存。使用包含數(shù)據(jù)的單個(gè)元素創(chuàng)建一個(gè)隊(duì)列。要訪(fǎng)問(wèn)數(shù)據(jù)時(shí),可拆散隊(duì)列。這使程序的其它部分不能同步訪(fǎng)問(wèn)某個(gè)數(shù)據(jù)。對(duì)數(shù)據(jù)操作完成后,將元素重新排入隊(duì)列。要傳遞的唯一對(duì)象是隊(duì)列的引用。傳遞隊(duì)列時(shí),LabVIEW不創(chuàng)建額外的數(shù)據(jù)副本。給隊(duì)列命名后,可在任何時(shí)候使用獲取隊(duì)列函數(shù)獲取隊(duì)列引用。創(chuàng)建多個(gè)數(shù)據(jù)對(duì)象與創(chuàng)建多個(gè)隊(duì)列一樣容易。
還可使用數(shù)據(jù)值引用存儲(chǔ)數(shù)據(jù),不創(chuàng)建額外數(shù)據(jù)備份。數(shù)據(jù)值引用比隊(duì)列速度更快,但是沒(méi)有超時(shí)選項(xiàng)??蔀閿?shù)據(jù)創(chuàng)建引用并傳遞引用,而不是傳遞數(shù)據(jù)至隊(duì)列。如要對(duì)數(shù)據(jù)進(jìn)行操作,可使用元素同址操作結(jié)構(gòu)。數(shù)據(jù)值引用寫(xiě)入/讀取元素邊框節(jié)點(diǎn)接受數(shù)據(jù)值引用輸入,用戶(hù)可在元素同址操作結(jié)構(gòu)中操作數(shù)據(jù)并替換原內(nèi)存中的數(shù)據(jù)。
注:可在類(lèi)屬性對(duì)話(huà)框的繼承頁(yè)上設(shè)置只有LabVIEW類(lèi)的成員VI才可創(chuàng)建類(lèi)的數(shù)據(jù)值引用。 |
也可使用功能全局變量在內(nèi)存中存儲(chǔ)大量數(shù)據(jù)。使用功能性全局變量,LabVIEW將在數(shù)據(jù)塊中保存和訪(fǎng)問(wèn)數(shù)據(jù)。這樣,不需大量?jī)?nèi)存就可以傳輸數(shù)據(jù)。未初始化的移位寄存器可用來(lái)保存數(shù)據(jù)。使用數(shù)組函數(shù)讀取、寫(xiě)入和重新調(diào)整數(shù)據(jù)。數(shù)組函數(shù)按順序排列數(shù)據(jù),不會(huì)創(chuàng)建數(shù)據(jù)副本。該方法通常比隊(duì)列方法慢。
評(píng)論