梁吉勝,李 偉,張 漫,原子波
(1.東北石油大學計算機與信息技術學院,黑龍江大慶163318;2.大慶石油管理局通信公司,黑龍江大慶163113)
在數字化油田的建設過程中,計算機軟件技術和石油勘探開發(fā)技術的發(fā)展相輔相成.計算機軟件是石油勘探開發(fā)技術的載體和具體體現,憑借著計算機優(yōu)異的大規(guī)模計算能力和軟件平臺靈活的擴展功能,在石油勘探開發(fā)過程中發(fā)揮著不可替代的核心作用.隨著先進技術在勘探開發(fā)過程中的應用,所獲取的地震資料越來越豐富,未來十年內地震勘探所獲取的數據量將達到PB級規(guī)模,計算量將達到10的23次方級規(guī)模,地震資料的存取面臨著重大問題[1].目前的地震數據處理方式是以文件流處理機制為基礎的,為高效的適應PC機群環(huán)境和海量數據處理任務在地震數據處理過程中地震數據的存取采用基于道集流處理機制.用內存代替磁盤作為暫存?zhèn)鬏斀橘|,增加數據交換速度不僅可以適應海量數據的要求,提高數據的存取效率,而且也是對當前整個地震資料處理流程的一次優(yōu)化,從而能夠有效的解決道集數據的存取面臨的問題[2].
虛擬內存系統(tǒng)以頁為基本單位,采用32位線性地址,該32位線性地址分別由頁目錄(Page Directory),頁表(Page Table)和頁(Page)共同組成.頁由頁表(Page Table)進行管理,而頁表又由頁目錄(Page Direc2tory)進行管理,每個頁目錄最多可以有1 024個頁表,每個頁表最多可以擁有1 024個頁,它們之間的關系如圖1所示.系統(tǒng)以頁的方式管理所有的內存,每頁為4 096字節(jié),即4 KB.32位操作系統(tǒng)中每個進程擁有屬于自己的4 GB的邏輯地址空間(頁表數×每個頁表中的頁數×頁大小,即1 024×1 024×4 096=4 GB),其中高2 GB地址空間用于系統(tǒng)使用,低2 GB地址空間用于進程使用[3].每個進程獨立的訪問自己的地址空間,不受其他進程的影響,從而增強了進程的健壯性.
圖1 內存中的頁管理樹
為了提高道集數據的抽取效率,在以某關鍵字建立索引的基礎上,對其采用基于內存映射的道集數據抽取.所謂映射就是建立一種一一對應關系,在這里主要是指將硬盤上文件位置與進程邏輯地址空間中一塊大小相同的區(qū)域之間的一一對應,這種對應關系純屬是邏輯上的概念,物理上是不存在的,原因是進程的邏輯地址空間本身就是不存在的.在內存映射的過程中,并沒有實際的數據拷貝,文件沒有被載入內存,只是邏輯上被放入了內存,具體到代碼,就是建立并初始化了相關的數據結構(struct address_space),這個過程有系統(tǒng)調用mmap ()實現.其原理如圖2所示.
在圖1中各個步驟內容如下.
步驟1:內存映射.
步驟2:主要是通過內存管理單元(MMU)進行邏輯地址和物理地址的轉換.
步驟3:進程第一次訪問ptr所指的內存區(qū)域造成缺頁中斷,然后由中斷處理函數完成拷貝,與內存映射無關.
圖2 內存映射的原理
步驟4:虛擬內存置換,與內存映射無關.
通過以上分析可以看出可以在進程地址空間中將磁盤上的文件部分或者全部映射到特定地址范圍,然后通過指針就可以訪問內存映射文件中的內容.一旦該文件被映射,就可以訪問它,就像整個文件已經加載內存一樣,從而可以不必對文件執(zhí)行I/O操作,這對大數據量文件來說存取效率較高以上為內存映射的主要原理.
在地震資料處理系統(tǒng)中使用內存映射文件方法處理數據,其主要步驟如下[4].
步驟1:創(chuàng)建或打開一個文件內核對象,該對象用于標識用作內存映射文件的磁盤文件.
步驟2:創(chuàng)建一個文件映射內核對象,告訴系統(tǒng)該文件的大小和訪問該文件的方式.
步驟3:系統(tǒng)將為文件數據保留一個地址空間區(qū)域,并將文件映射對象的全部或一部分映射到進程地址空間中.此后,對內存映射文件的使用和處理同通常加載到內存中的文件數據的處理方式基本一樣.當完成對內存映射文件的使用后,必須執(zhí)行下面步驟將它清除.
步驟4:從進程的地址空間中撤消文件映射內核對象的映射.
步驟5:關閉文件映射內核對象和文件內核對象.
內存映射文件提供了一種在需要時才將部分文件數據映射到內存中的機制.該機制的好處在于應用程序只需要從大量數據中獲取一小部分數據而不必將所有的數據文件讀到內存中,因此可以節(jié)約大量的內存.
通過分析相關資料,對地震數據文件特點概括如下:1)數據道道數多;2)道頭屬性關鍵字多;3)關鍵字數值多.
所以用戶在觀測地震數據時,需要對某一些具有相同屬性的地震數據進行觀測.也就是說,假設一個含有1 000道數據道、72個關鍵字、每個關鍵字含有100個值的地震數據文件,用戶對該文件數據進行數據觀測操作,把某一屬性關鍵字數值相同的所有道數據放在一起進行數據觀察,就需要至少7 200個方案.每個方案所需要的數據道道號不盡相同,在原有文件中也多數不是順序相連的,所以對在不改變與文件任何數據結構的情況下,對數據進行觀測.在一個地震數據文件中,用戶只需要針對其中一部分數據進行操作,也就是說有很大一部分數據用戶完全不需要,為了更方便用戶操作,以及操作速度更快,可以在原地震數據的基礎上,生成更適合用戶的新的地震數據文件,而將原有文件中用戶所需要的那部分數據根據用戶需求重新排序復制到新的文件中的過程.
有分析可見地震道集數據操作復雜繁瑣通過內存映射的方式有效的解決了這一問題其主要實現代碼如下.
建立內存映射的效率要比read和write系統(tǒng)調用效率高,原因是read()是系統(tǒng)調用,其中進行了數據拷貝,它首先將文件內容從硬盤拷貝到內核空間的一個緩沖區(qū),然后再將這些數據拷貝到用戶空間,在這個過程中,實際上完成了 兩次數據拷貝,其原理如圖3所示.
圖3 系統(tǒng)函數read存取的原理
由圖3可以看出mmap()也是系統(tǒng)調用,mmap()中沒有進行數據拷貝,真正的數據拷貝是在缺頁中斷處理時進行的,由于mmap()將文件直接映射到用戶空間,所以中斷處理函數根據這個映射關系,直接將文件從硬盤拷貝到用戶空間,只進行了一次數據拷貝[5-6].因此,內存映射的效率要比read/write效率高.
通過實驗對2 GB的文件進行了測試其主要結果如表1.
表1 實驗結果分析
通過分析實驗結果可以看出基于內存映射的地震道集數據的存取其效率高于普通的系統(tǒng)函數read近3倍,其中以全局方式映射道集數據耗時最短,基于內存映射的道集數據的存取很大程度上提高了數據在地震資料處理流程中的應用.
本文分析了結合地震數據的特點分析了內存映射的原理,并將其應用在地震道集數據的存取過程,在此基礎上同傳統(tǒng)的I/O方式進行了對比,通過實驗驗證了基于內存映射的道集數據存取的可行性.從而在很大程度上提高了數據流動速率,有效的提高了地震數據的處理的效率.
[1] 趙改善.我們需要多大和多快的計算機?[J].勘探地球物理進展,2004,27(1):22-28.
[2] 張春建.內存映射文件的操作[J].電腦編程技巧與維護,2008,(04):78-82.
[3] 楊寧學,諸昌鈐,聶愛麗.內存映射文件及其在大數據量文件快速存取中的應用[J].計算機應用研究,2004(8):257-260.
[4] 于慧彬,齊 鵬,梁 捷,等.內存映射文件在大數據量海洋調查數據處理中的應用[J].海洋技術,2010(1):573-578.
[5] Microsoft Corp.Microsoft MSDN[DB/OL].http://www.Microsoft.com/msdn,2000.
[6] 文必龍,于永剛,劉永江.地震資料處理集成平臺框架研究與設計[J].哈爾濱商業(yè)大學學報:自然科學版,2011,27 (5):709-712.