劉平 賈林林
摘 要:大數(shù)據(jù)的高速實(shí)時存儲是某圖像采集設(shè)備研發(fā)過程中所要面對的一項(xiàng)問題,為了解決數(shù)據(jù)吞吐量大、系統(tǒng)并行處理任務(wù)多等問題,不進(jìn)行數(shù)據(jù)緩沖存儲以及文件I/O操作的內(nèi)存映射文件正是解決多個進(jìn)程間數(shù)據(jù)共享的最有效方法。結(jié)合某測控設(shè)備的實(shí)際研發(fā),對內(nèi)存映射技術(shù)的運(yùn)行機(jī)制和具體實(shí)現(xiàn)流程進(jìn)行進(jìn)一步的研究,并針對實(shí)際情況進(jìn)行特殊處理,以保證數(shù)據(jù)存儲的實(shí)時性和穩(wěn)定性。最后經(jīng)過測控設(shè)備的實(shí)際測試,內(nèi)存映射技術(shù)表現(xiàn)出良好的性能,滿足系統(tǒng)數(shù)據(jù)存儲方面的要求,而且相比較其他方式占用極少的物理資源,不會影響系統(tǒng)的性能。
關(guān)鍵詞:內(nèi)存映射;大數(shù)據(jù);多線程;實(shí)時
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼: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元圖像采集系統(tǒng)用于紅外產(chǎn)品圖像高速實(shí)時的連續(xù)處理,系統(tǒng)要求紅外圖像能夠無差錯地實(shí)時存儲1h。按照產(chǎn)品每秒100幀頻計(jì)算,1h的數(shù)據(jù)存儲量大約為11.15GB,對于如此大數(shù)據(jù)量的存儲,采用普通文件進(jìn)行操作受限于Windows進(jìn)程空間有限,無法實(shí)現(xiàn)4GB以上數(shù)據(jù)文件一次性存儲。另外,基于文件I/O操作的普通文件操作,其存儲速度慢,容易在此類實(shí)時性要求較高的系統(tǒng)中出現(xiàn)圖像采集丟幀、顯示速率不達(dá)要求、存儲壓力過大、運(yùn)行可靠性低等問題,從而導(dǎo)致任務(wù)要求無法完成[1,2]。
通過設(shè)計(jì)專門的內(nèi)存映射機(jī)制實(shí)現(xiàn)高速實(shí)時的紅外圖像實(shí)時存儲,可以解決大數(shù)據(jù)量的實(shí)時存儲問題。同時,該設(shè)計(jì)具備的高效率與高可靠性,也能夠滿足整個系統(tǒng)的其他要求。
1 內(nèi)存映射存儲特點(diǎn)
現(xiàn)在,一般采取內(nèi)存映射技術(shù)完成大文件的實(shí)時存儲操作。內(nèi)存映射技術(shù)是Windows的一種內(nèi)存管理方法。通過這種方式,在不占用額外的磁盤空間和內(nèi)存空間條件下,就能實(shí)現(xiàn)目標(biāo)磁盤文件與進(jìn)程虛擬地址空間的對應(yīng)關(guān)系。由于省去了數(shù)據(jù)緩沖存儲及文件I/O操作,內(nèi)存映射處理文件存儲,速度很快而且能夠一次性處理16EB(64位機(jī))的數(shù)據(jù)量。
2 內(nèi)存映射技術(shù)實(shí)現(xiàn)機(jī)制
內(nèi)存映射文件與虛擬內(nèi)存技術(shù)從本質(zhì)上比較接近,兩者雖然都是在磁盤空間內(nèi)保留一定地址空間的區(qū)域用于完成大文件的存儲,但是地址空間的性質(zhì)有所不同,內(nèi)存文件映射的物理存儲器不是虛擬內(nèi)存所采用的系統(tǒng)頁文件,而是使用某個已經(jīng)存在于磁盤上的文件,而且在對這個文件進(jìn)行操作之前先期以一種類似于將文件整體從磁盤加載至內(nèi)存的方式完成映射操作。
內(nèi)存映射技術(shù)最大的優(yōu)點(diǎn)在于,不對文件執(zhí)行I/O操作就能處理存儲于磁盤上的文件,這樣做在數(shù)據(jù)處理的過程中將不需要為所有的文件重新申請并分配緩存,這類緩存操作將由系統(tǒng)直接進(jìn)行管理,從而大大提高了系統(tǒng)的運(yùn)行效率。
在處理大數(shù)據(jù)量的文件時,采用內(nèi)存映射文件技術(shù)與其他數(shù)據(jù)存儲方式相比,有其顯而易見的優(yōu)越性,因?yàn)樵谡麄€過程中將不再需要進(jìn)行將文件數(shù)據(jù)加載至內(nèi)存的操作,也不需要完成將數(shù)據(jù)從內(nèi)存回寫至文件和釋放內(nèi)存塊等操作。
實(shí)際應(yīng)用的系統(tǒng)很少采用單一線程模式運(yùn)行,一般都是具有數(shù)據(jù)共享性質(zhì)的多線程同時工作。共享的數(shù)據(jù)量小仍可以采取采取靈活多變的處理方式,但是如果共享數(shù)據(jù)的容量巨大,那么如果不使用內(nèi)存映射文件技術(shù)而過多操作磁盤和內(nèi)存,將會使系統(tǒng)資源不堪重負(fù)。從這一點(diǎn)來說,多線程數(shù)據(jù)共享處理方法首推內(nèi)存映射文件技術(shù)。
3 內(nèi)存映射技術(shù)運(yùn)行流程
軟件設(shè)計(jì)過程中,為了實(shí)現(xiàn)一次性存儲大于4GB圖像數(shù)據(jù),并保證存儲的實(shí)時性,應(yīng)用內(nèi)存映射文件處理方式來滿足要求,并在映射中作了特殊處理保證存儲的穩(wěn)定性。圖1給出了內(nèi)存映射文件的流程圖。
受Windows系統(tǒng)的限制,一個32位進(jìn)程最大可分配4GB的虛擬地址空間,實(shí)際工程應(yīng)用過程中不可能將大于這一容量的文件通過一次映射操作就完成存儲。當(dāng)需要處理的文件容量超過4GB時,就只能將此大文件的各個部分映射到進(jìn)程的地址空間之后取消映射,然后重新映射文件的下一部分?jǐn)?shù)據(jù)。這需要對上面的一般流程進(jìn)行適當(dāng)?shù)母?,形成如圖2的大文件內(nèi)存映射流程圖。
該函數(shù)中的主要參數(shù)說明:將要映射到進(jìn)程的地址空間的文件句柄通過hfile參數(shù)指定,其就是之前CreateFile()函數(shù)得到的文件句柄。同時,當(dāng)需要將存儲器映射到進(jìn)程的地址空間中時,系統(tǒng)首先確認(rèn)物理存儲器頁面的應(yīng)被賦予何種保護(hù)屬性,而且該屬性必須與CreateFile()函數(shù)打開文件時所指定的訪問標(biāo)識相匹配。
Windows可以采用64位值來進(jìn)行文件操作,那么就需要劃分一定大小的物理存儲器空間用來存儲內(nèi)存映射文件,這時可以用2個重要參數(shù)“dwMaximumSizeHigh”與“dwMaximumSizeLow”分別指定內(nèi)存映射文件內(nèi)核對象大小的高32位值和低32位值。如果將其都設(shè)置為0,那么將為創(chuàng)建的“文件映射”內(nèi)核對象保留與物理文件實(shí)際容量相同大小的區(qū)域。
關(guān)鍵問題是上面2個參數(shù)所指定的大小必須是系統(tǒng)最小分配粒度的整數(shù)倍,即64KB的整數(shù)倍。在某圖像采集系統(tǒng)軟件設(shè)計(jì)中圖像數(shù)據(jù)一次性存儲為12GB左右,因此設(shè)定15GB的存儲空間,即2個參數(shù)分別為0x00000003和0xc0000000。
已經(jīng)打開的內(nèi)核對象需要在使用完畢之后通過CloseHandle()函數(shù)將其關(guān)閉,這與Win32的大多數(shù)對象相同。假如此時不進(jìn)行關(guān)閉對象的操作,那么程序繼續(xù)運(yùn)行將出現(xiàn)資源泄露的現(xiàn)象。那么即使程序退出運(yùn)行后操作系統(tǒng)會自動關(guān)閉在進(jìn)程中打開而未關(guān)閉的任何對象,也會在隨后的進(jìn)程運(yùn)行過程中必然不斷積累過多的資源句柄。所以,通過CloseHandle()函數(shù)將那些不再使用的內(nèi)核對象關(guān)閉是必須的。
4 存儲效果及特殊處理
實(shí)際測試證明,進(jìn)行大數(shù)據(jù)文件處理時采用內(nèi)存映射文件技術(shù)具有很好的效果,系統(tǒng)可以能夠穩(wěn)定存儲數(shù)據(jù)1h,滿足設(shè)計(jì)要求。采用此處理方式與通常用CFile類和ReadFile()和WriteFile()等函數(shù)的方式相比對系統(tǒng)性能的影響微乎其微,因?yàn)槠渌牡奈锢碣Y源極少。
由于實(shí)際應(yīng)用中圖像數(shù)據(jù)每次存儲量均不同,可能僅有幾秒鐘的圖像即數(shù)十兆的數(shù)據(jù)量,為了使存儲滿足按需分配,在結(jié)束存儲時要進(jìn)行特殊的處理。圖4給出了實(shí)現(xiàn)此要求的主要步驟。
其中,以實(shí)際長度創(chuàng)建文件映射中將原文件映射的最終偏移量作為創(chuàng)建映射對象函數(shù)的內(nèi)置參數(shù),即創(chuàng)建了實(shí)際大小的文件映射對象。此外,要注意的是每次拷貝的數(shù)據(jù)量不能太大,最大不要超過進(jìn)程的可分配地址空間2GB;也不要太小,以免拷貝次數(shù)太多,影響系統(tǒng)性能。在本圖像采集系統(tǒng)軟件設(shè)計(jì)中取320、640、800MB做試驗(yàn),發(fā)現(xiàn)取640MB為一次拷貝運(yùn)行良好,對系統(tǒng)性能無太大影響。
參考文獻(xiàn):
[1]張澤清.淺析Windows內(nèi)存映射文件[J].福建師大福清分校學(xué)報(bào),2006(2):20-25.
[2]吳志紅,孫力,閻杰.高速紅外圖像實(shí)時采集存儲與顯示技術(shù)[J].紅外技術(shù),2003(5):56-59.