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