劉平 賈林林
摘 要:大數據的高速實時存儲是某圖像采集設備研發過程中所要面對的一項問題,為了解決數據吞吐量大、系統并行處理任務多等問題,不進行數據緩沖存儲以及文件I/O操作的內存映射文件正是解決多個進程間數據共享的最有效方法。結合某測控設備的實際研發,對內存映射技術的運行機制和具體實現流程進行進一步的研究,并針對實際情況進行特殊處理,以保證數據存儲的實時性和穩定性。最后經過測控設備的實際測試,內存映射技術表現出良好的性能,滿足系統數據存儲方面的要求,而且相比較其他方式占用極少的物理資源,不會影響系統的性能。
關鍵詞:內存映射;大數據;多線程;實時
中圖分類號:TP311 文獻標識碼:A 文章編號:1003-5168(2017)03-0039-03
Abstract: The high-speed real-time storage of big data is a problem faced in the process of equipment research and development of an image acquisition, data throughput, in order to solve the problem of parallel processing system more tasks, not the data buffer storage and file I/O operation of the memory mapped file is the most effective method to solve the data sharing between multiple processes. Combined with the actual research for measurement and control equipment, the memory mapping technology operation mechanism and implementation process were further studied, and according to the actual situation of the special treatment to ensure the real-time and stability of data storage. The result of test and control equipment, memory mapping technology shows good performance, to meet the requirements of the data storage system, and compared with other means occupy very little physical resources, will not affect the performance of the system.
Keywords: memory mapping;large data;multithread;real-time
某128×128元圖像采集系統用于紅外產品圖像高速實時的連續處理,系統要求紅外圖像能夠無差錯地實時存儲1h。按照產品每秒100幀頻計算,1h的數據存儲量大約為11.15GB,對于如此大數據量的存儲,采用普通文件進行操作受限于Windows進程空間有限,無法實現4GB以上數據文件一次性存儲。另外,基于文件I/O操作的普通文件操作,其存儲速度慢,容易在此類實時性要求較高的系統中出現圖像采集丟幀、顯示速率不達要求、存儲壓力過大、運行可靠性低等問題,從而導致任務要求無法完成[1,2]。
通過設計專門的內存映射機制實現高速實時的紅外圖像實時存儲,可以解決大數據量的實時存儲問題。同時,該設計具備的高效率與高可靠性,也能夠滿足整個系統的其他要求。
1 內存映射存儲特點
現在,一般采取內存映射技術完成大文件的實時存儲操作。內存映射技術是Windows的一種內存管理方法。通過這種方式,在不占用額外的磁盤空間和內存空間條件下,就能實現目標磁盤文件與進程虛擬地址空間的對應關系。由于省去了數據緩沖存儲及文件I/O操作,內存映射處理文件存儲,速度很快而且能夠一次性處理16EB(64位機)的數據量。
2 內存映射技術實現機制
內存映射文件與虛擬內存技術從本質上比較接近,兩者雖然都是在磁盤空間內保留一定地址空間的區域用于完成大文件的存儲,但是地址空間的性質有所不同,內存文件映射的物理存儲器不是虛擬內存所采用的系統頁文件,而是使用某個已經存在于磁盤上的文件,而且在對這個文件進行操作之前先期以一種類似于將文件整體從磁盤加載至內存的方式完成映射操作。
內存映射技術最大的優點在于,不對文件執行I/O操作就能處理存儲于磁盤上的文件,這樣做在數據處理的過程中將不需要為所有的文件重新申請并分配緩存,這類緩存操作將由系統直接進行管理,從而大大提高了系統的運行效率。
在處理大數據量的文件時,采用內存映射文件技術與其他數據存儲方式相比,有其顯而易見的優越性,因為在整個過程中將不再需要進行將文件數據加載至內存的操作,也不需要完成將數據從內存回寫至文件和釋放內存塊等操作。
實際應用的系統很少采用單一線程模式運行,一般都是具有數據共享性質的多線程同時工作。共享的數據量小仍可以采取采取靈活多變的處理方式,但是如果共享數據的容量巨大,那么如果不使用內存映射文件技術而過多操作磁盤和內存,將會使系統資源不堪重負。從這一點來說,多線程數據共享處理方法首推內存映射文件技術。
3 內存映射技術運行流程
軟件設計過程中,為了實現一次性存儲大于4GB圖像數據,并保證存儲的實時性,應用內存映射文件處理方式來滿足要求,并在映射中作了特殊處理保證存儲的穩定性。圖1給出了內存映射文件的流程圖。
受Windows系統的限制,一個32位進程最大可分配4GB的虛擬地址空間,實際工程應用過程中不可能將大于這一容量的文件通過一次映射操作就完成存儲。當需要處理的文件容量超過4GB時,就只能將此大文件的各個部分映射到進程的地址空間之后取消映射,然后重新映射文件的下一部分數據。這需要對上面的一般流程進行適當的更改,形成如圖2的大文件內存映射流程圖。
該函數中的主要參數說明:將要映射到進程的地址空間的文件句柄通過hfile參數指定,其就是之前CreateFile()函數得到的文件句柄。同時,當需要將存儲器映射到進程的地址空間中時,系統首先確認物理存儲器頁面的應被賦予何種保護屬性,而且該屬性必須與CreateFile()函數打開文件時所指定的訪問標識相匹配。
Windows可以采用64位值來進行文件操作,那么就需要劃分一定大小的物理存儲器空間用來存儲內存映射文件,這時可以用2個重要參數“dwMaximumSizeHigh”與“dwMaximumSizeLow”分別指定內存映射文件內核對象大小的高32位值和低32位值。如果將其都設置為0,那么將為創建的“文件映射”內核對象保留與物理文件實際容量相同大小的區域。
關鍵問題是上面2個參數所指定的大小必須是系統最小分配粒度的整數倍,即64KB的整數倍。在某圖像采集系統軟件設計中圖像數據一次性存儲為12GB左右,因此設定15GB的存儲空間,即2個參數分別為0x00000003和0xc0000000。
已經打開的內核對象需要在使用完畢之后通過CloseHandle()函數將其關閉,這與Win32的大多數對象相同。假如此時不進行關閉對象的操作,那么程序繼續運行將出現資源泄露的現象。那么即使程序退出運行后操作系統會自動關閉在進程中打開而未關閉的任何對象,也會在隨后的進程運行過程中必然不斷積累過多的資源句柄。所以,通過CloseHandle()函數將那些不再使用的內核對象關閉是必須的。
4 存儲效果及特殊處理
實際測試證明,進行大數據文件處理時采用內存映射文件技術具有很好的效果,系統可以能夠穩定存儲數據1h,滿足設計要求。采用此處理方式與通常用CFile類和ReadFile()和WriteFile()等函數的方式相比對系統性能的影響微乎其微,因為其所消耗的物理資源極少。
由于實際應用中圖像數據每次存儲量均不同,可能僅有幾秒鐘的圖像即數十兆的數據量,為了使存儲滿足按需分配,在結束存儲時要進行特殊的處理。圖4給出了實現此要求的主要步驟。
其中,以實際長度創建文件映射中將原文件映射的最終偏移量作為創建映射對象函數的內置參數,即創建了實際大小的文件映射對象。此外,要注意的是每次拷貝的數據量不能太大,最大不要超過進程的可分配地址空間2GB;也不要太小,以免拷貝次數太多,影響系統性能。在本圖像采集系統軟件設計中取320、640、800MB做試驗,發現取640MB為一次拷貝運行良好,對系統性能無太大影響。
參考文獻:
[1]張澤清.淺析Windows內存映射文件[J].福建師大福清分校學報,2006(2):20-25.
[2]吳志紅,孫力,閻杰.高速紅外圖像實時采集存儲與顯示技術[J].紅外技術,2003(5):56-59.