郭學(xué)兵
?
基于Python的并行編程技術(shù)在批量氣象規(guī)范報表入庫處理中的應(yīng)用
郭學(xué)兵
(中國科學(xué)院地理科學(xué)與資源研究所生態(tài)系統(tǒng)網(wǎng)絡(luò)觀測與模擬重點(diǎn)實(shí)驗(yàn)室,北京 100101)
為滿足中國生態(tài)系統(tǒng)研究網(wǎng)絡(luò)(英文全稱Chinese Ecosystem Research Network,簡稱CERN)對大批量氣象規(guī)范報表(Excel格式)進(jìn)行高效快速轉(zhuǎn)換并載入數(shù)據(jù)庫的需求,作者在對當(dāng)前流行的并行編程方法和技術(shù)進(jìn)行對比研究的基礎(chǔ)上,提出了利用Python的多進(jìn)程編程技術(shù)實(shí)現(xiàn)報表處理的方案,建立了CERN氣象規(guī)范報表的抽象數(shù)據(jù)轉(zhuǎn)換模型,并編寫了多進(jìn)程并行處理程序,實(shí)現(xiàn)了將大批量氣象報表的快速轉(zhuǎn)換載入Oracle數(shù)據(jù)庫的功能。同時,作者對多進(jìn)程編程的不同參數(shù)設(shè)置情景下的轉(zhuǎn)換效率進(jìn)行了測試、比較和分析。實(shí)驗(yàn)結(jié)果顯示,利用Python并行編程技術(shù)可以充分利用計算機(jī)硬件的潛力和性能,從而大大提高處理效率,且方法簡便、事半功倍。作者最后進(jìn)一步建議通過利用Parallel Python軟件包,可更充分利用計算機(jī)多核性能,更大程度提高處理效率。更加滿足CERN日益增長的數(shù)據(jù)快速處理需求。同時本文為類似數(shù)據(jù)處理需求提供了可借鑒的參考方案。
中國生態(tài)系統(tǒng)研究網(wǎng)絡(luò);CERN;python;并行編程;多進(jìn)程;氣象;報表;轉(zhuǎn)換入庫
中國生態(tài)系統(tǒng)研究網(wǎng)絡(luò)(英文全稱Chinese Ecosystem Research Network,簡稱CERN)始建于1988年。目前,CERN包含覆蓋全國主要類型區(qū)(農(nóng)田、森林、草原、荒漠、濕地、湖泊、海灣生態(tài)系統(tǒng)等)共計44個野外生態(tài)站,另有水分、土壤、大氣等5個學(xué)科分中心和1個綜合中心。CERN與美國長期生態(tài)研究網(wǎng)絡(luò)(US LTER Network)和英國環(huán)境變化網(wǎng)絡(luò)(ECN)并列成為世界最為重要的國家級生態(tài)系統(tǒng)網(wǎng)絡(luò),是中國生態(tài)學(xué)領(lǐng)域的重要觀測、研究、示范基地[1]。
CERN以野外生態(tài)站為基礎(chǔ)單元開展各類生態(tài)系統(tǒng)中水分、土壤、生物、大氣環(huán)境要素的長期觀測,產(chǎn)生的數(shù)據(jù)由相關(guān)各方(產(chǎn)生者—生態(tài)站,質(zhì)量控制者—學(xué)科分中心,數(shù)據(jù)集成者—綜合中心)按照統(tǒng)一規(guī)定的數(shù)據(jù)監(jiān)測規(guī)范及信息規(guī)范,對數(shù)據(jù)進(jìn)行相應(yīng)處理并實(shí)現(xiàn)生態(tài)站-分中心-綜合中心逐級質(zhì)量控制和數(shù)據(jù)報送。綜合中心是所有生態(tài)站、各類環(huán)境要素數(shù)據(jù)的最終集成單位,因此綜合中心必須通過開發(fā)軟件系統(tǒng),實(shí)現(xiàn)這些數(shù)據(jù)的快速處理、入庫及網(wǎng)上發(fā)布共享等整套業(yè)務(wù)的長期穩(wěn)定運(yùn)行,以便為我國生態(tài)與環(huán)境保護(hù)、資源合理利用和國家可持續(xù)發(fā)展及應(yīng)對全球變化等提供長期、系統(tǒng)的科學(xué)數(shù)據(jù)和決策依據(jù)[1]。
CERN傳統(tǒng)氣象數(shù)據(jù)報表轉(zhuǎn)換入庫處理程序采用微軟Windows環(huán)境下OFFICE COM對象(Component Object Model)的面向?qū)ο缶幊谭椒?,在Microsoft Visual Foxpro6.0編程環(huán)境下實(shí)現(xiàn)對Excel文件的讀寫(顯式或隱式運(yùn)行Excel 應(yīng)用,操作工作薄、工作表對象,實(shí)現(xiàn)數(shù)據(jù)存取操作等),實(shí)現(xiàn)從Excel數(shù)據(jù)到VFP數(shù)據(jù)庫表(.dbf文件)的數(shù)據(jù)移動[2]。然后再將.dbf文件數(shù)據(jù)表升遷到Oracle數(shù)據(jù)庫。
這種傳統(tǒng)的數(shù)據(jù)處理方法需要不斷地進(jìn)行I/O處理,因此造成處理時間過長[3],不能充分利用計算機(jī)性能,導(dǎo)致數(shù)據(jù)處理效率低下(CERN單一指標(biāo)的數(shù)據(jù)處理大約耗費(fèi)半小時)。
隨著CERN野外生態(tài)站個數(shù)、監(jiān)測指標(biāo)個數(shù)不斷增加等情況出現(xiàn),數(shù)據(jù)采集正朝著海量化方向發(fā)展,這對數(shù)據(jù)處理和質(zhì)量控制的效率提出了更高挑戰(zhàn);同時,計算機(jī)硬件技術(shù)也日新月異地發(fā)展,處理器性能不斷提高,且多核處理器已成為當(dāng)前處理器技術(shù)的發(fā)展方向,這些硬件變化的同時引領(lǐng)軟件研發(fā)發(fā)生了基礎(chǔ)性變化?;诙嗪说牟⑿刑幚硎浅浞职l(fā)揮多核CPU強(qiáng)大運(yùn)算能力的有效途徑,并行計算模式正成為當(dāng)前及未來程序開發(fā)的發(fā)展趨勢,具有十分廣闊的應(yīng)用價值[4]。
傳統(tǒng)程序基本上是為順序處理器書寫的,大部分程序在多處理器上不能直接獲得加速,不再適應(yīng)新形勢下的數(shù)據(jù)處理需求。解決這一問題的途徑之一是使用多處理器并行處理技術(shù)把順序程序轉(zhuǎn)換為并行程序[5],才能充分利用目前多核計算機(jī)等提供的計算資源等。
本文主要針對CERN生態(tài)站大批量的由自動氣象觀測站采集的固定格式Excel數(shù)據(jù)報表,進(jìn)行快速轉(zhuǎn)換并入庫的并行處理技術(shù)方法進(jìn)行分析、研究、實(shí)踐驗(yàn)證。作者首先對當(dāng)前流行的并行編程方法和技術(shù)進(jìn)行了對比研究,提出了基于Python多進(jìn)程編程技術(shù)實(shí)現(xiàn)報表轉(zhuǎn)換入庫的構(gòu)。然后建立了CERN氣象規(guī)范報表的抽象數(shù)據(jù)轉(zhuǎn)換模型,利用Python2.7編寫了多進(jìn)程并行程序,實(shí)現(xiàn)了氣象規(guī)范報表的快速轉(zhuǎn)換及載入Oracle數(shù)據(jù)庫功能,并對多進(jìn)程編程的不同參數(shù)設(shè)置情景下的轉(zhuǎn)換效率進(jìn)行了比較和分析。結(jié)果表明基于Python的并行處理技術(shù)極大提升了應(yīng)用程序的運(yùn)行效率,充分發(fā)揮了計算機(jī)硬件性能。
根據(jù)對并行處理技術(shù)的綜述性文獻(xiàn)內(nèi)容進(jìn)行歸納總結(jié),多線程并行程序設(shè)計方法目前主要包括以下幾種[6]:
(1)顯示線程編程
并行編程可以調(diào)用系統(tǒng)函數(shù)啟動多線程,例如:Pthreads、Java線程類、微軟Widows線程API。
(2)利用并行編程模型的編譯器指導(dǎo)的編程
? OpenMP:OpenMP是一種面向共享內(nèi)存的多處理器多線程并行編程模型,為在共享存儲的多處理機(jī)上編寫并行程序而設(shè)計的應(yīng)用編程接口,運(yùn)行在單機(jī)多核并行計算環(huán)境下。由一個小型的編譯器命令集組成,包括一套編譯制導(dǎo)語句和一個用來支持它的函數(shù)庫。OpenMP 的編程模型以線程為基礎(chǔ),通過編譯指導(dǎo)語句來顯示地指導(dǎo)共享內(nèi)存的多線程并行化,為編程人員提供了并行化的完整控制。通過與標(biāo)準(zhǔn)Fortran,C和C ++結(jié)合進(jìn)行編程[5]
? Intel TBB:Intel Thread Building Block編譯器
(3)利用并行應(yīng)用庫編程
? Intel IPPMKL,ScalaPACK、PARDISO
? MPI:MPI(Message Passing Interface)是基于消息傳遞的并行編程模型。消息傳遞指的是并行執(zhí)行的各個進(jìn)程具有自己獨(dú)立的堆棧和代碼段,作為互不相關(guān)的多個程序獨(dú)立執(zhí)行,進(jìn)程之間的通信通過顯式地調(diào)用通信函數(shù)來完成[7]。它用于非共享內(nèi)存(即分布式共享內(nèi)存)的集群計算環(huán)境,是用于計算機(jī)集群的編程技術(shù)。
(4)并行程序語言編程
目前有150種以上并行編程語言,其中Python是著名的一種并行程序開發(fā)語言,有進(jìn)程池概念,不用自己創(chuàng)建進(jìn)程。
(5)MapReduce
MapReduce是一種基于Google云計算平臺的分布式編程模型,其云計算基礎(chǔ)架構(gòu)包括3個相互獨(dú)立又緊密結(jié)合的系統(tǒng)(分布式文件系統(tǒng)GFS、并行編程模型和任務(wù)調(diào)度模型MapReduce、處理結(jié)構(gòu)化以及半結(jié)構(gòu)化數(shù)據(jù)的大規(guī)模分布式數(shù)據(jù)庫Bigtable)。Apache Hadoop是一種由Java語言編寫的運(yùn)行在Linux 操作系統(tǒng)之上的開源云計算平臺,由HDFS(Hadoop Distribute File System)和Hadoop MapReduce 兩個核心部件組成,二者分別是GFS 和Google MapReduce的開源實(shí)現(xiàn),Hadoop目前已經(jīng)成為大數(shù)據(jù)領(lǐng)域事實(shí)上的標(biāo)準(zhǔn)[8]。
綜上所述,目前并行程序設(shè)計方法非常多樣化,而且仍處于不斷發(fā)展之中,并無固定不變的定式。并行程序設(shè)計方法支持不同的開發(fā)環(huán)境,開發(fā)復(fù)雜度及開發(fā)成本相異,適宜處理不同規(guī)模及特征的數(shù)據(jù)與處理方法,可分別滿足不同的并行處理流程、應(yīng)用場景需求。
本文重點(diǎn)討論應(yīng)用Python面向?qū)ο蟮膭討B(tài)的高級程序設(shè)計語言,基于其并行程序編程方法以及強(qiáng)大科學(xué)計算功能而開發(fā)并行處理程序,實(shí)現(xiàn)CERN批量氣象規(guī)范報表的快速轉(zhuǎn)換入庫的方法和技術(shù)。
Python是一種模塊化設(shè)計的,具有簡潔和高可讀性語法的高級編程語言,且支持多種方式的并行編程。基于Python語言的并行編程技術(shù)發(fā)展至今,形成了5種模式,分別是:異步編程模式、分布式并行模式、GPU并行模式、基于多線程的并行模式和基于多進(jìn)程的并行模式。其中,異步編程模式適用于因復(fù)雜任務(wù)中的子任務(wù)爭奪運(yùn)算資源,而需要在程序運(yùn)行期間協(xié)調(diào)CPU使用權(quán)的情況;分布式并行模式應(yīng)用于集群運(yùn)算;GPU并行模式則應(yīng)用于圖4形及科學(xué)運(yùn)算。這兩種模式均不適合CERN的氣象數(shù)據(jù)報表轉(zhuǎn)換處理的應(yīng)用需求[9]。而“多線程”和“多進(jìn)程”是可用于CERN氣象規(guī)范報表轉(zhuǎn)換處理并行化運(yùn)行的主要實(shí)現(xiàn)方式。
Python由于全局鎖GIL(Global Interpreter Lock)的存在,Python中的多線程其實(shí)并不是真正的多線程,Python的多線程不是并行執(zhí)行(物理上同時發(fā)生)而是并發(fā)執(zhí)行(輪換執(zhí)行,邏輯上同時發(fā)生),還不能利用多核CPU[10]。如果想要充分使用多核CPU的資源,Python3.4中的 Parallel Python包可支持多CPU并行計算。
在Python2.7中使用多進(jìn)程,它通過采用子進(jìn)程的技術(shù)避開GIL,使用multiprocessing進(jìn)行多進(jìn)程編程提高程序效率。Python提供了非常好用的多進(jìn)程包multiprocessing,可輕松完成從單進(jìn)程到并發(fā)執(zhí)行的轉(zhuǎn)換,只需要編程人員定義一個函數(shù),Python會完成其他所有事情。Multiprocessing支持子進(jìn)程、通信和共享數(shù)據(jù)、支持執(zhí)行不同方式的同步,提供了Process、Queue、Pipe、Lock等組件來支持對程序并行化的控制。
(1)待處理報表源文件(from_Sheet)
待處理的CERN氣象規(guī)范報表每年包含待528個待處理文件(每年44個生態(tài)站,12個月/生態(tài)站),每個excel文件中包含共計26個指標(biāo)的sheet,分別存儲氣溫(T)、氣壓(P)、海平面氣壓(P0)、降水(R)、相對濕度(RH)、地表溫度(Tg0)、1小時風(fēng)速(W60)、10分鐘極大風(fēng)速(W10M)、2分鐘平均風(fēng)速(W2)、10分鐘平均風(fēng)速(W10A)等指標(biāo)的每月儀器自動記錄的各日逐時數(shù)據(jù)、逐日數(shù)據(jù)(日最高、日平均、日最低等)、逐月數(shù)據(jù)(月最高、月平均、月最低等)等子指標(biāo)[11]。
Excel文件命名方式:3位臺站代碼+4位年份+2位月份。例如AKA201401.xls表示阿克蘇站2014年1月的觀測數(shù)據(jù)文件。
(2)轉(zhuǎn)換目標(biāo)表(to_Table)
每個指標(biāo)的sheet數(shù)據(jù)將被轉(zhuǎn)換分解為三個有待載入Oracle數(shù)據(jù)庫表的子指標(biāo),例如氣溫(T)sheet最終將被轉(zhuǎn)換為3個子指標(biāo):小時尺度氣溫(T1)、日尺度氣溫(T2)、月尺度氣溫(T3),它們分別是二維關(guān)系數(shù)據(jù)表的格式,其數(shù)據(jù)項的說明字典如下:
表代碼及表名稱列代碼及其中文含義 T1(自動站每日逐時氣溫表)代碼SSS000YYYY00MM0000DD0000T102T104T106T108T110……T148 中文含義臺站代碼年月日21時22時23時24時1時……20時 T2(自動站逐日氣溫)代碼SSS000YYYY00MM0000DD0000MEAN00MAX000TIME10MIN000TIME20 中文含義臺站代碼年月日日平均值日最大值日最大值出現(xiàn)時間日最小值日最小值出現(xiàn)時間 T3(自動站逐月氣溫)代碼SSS000YYYY00MM0000T302T304T306MAX000TIME10MIN000TIME20 中文含義臺站代碼年月月平均日最大值月平均日最小值月平均月極大值月極大值出現(xiàn)日期月極小值月極小值出現(xiàn)日期
(3)數(shù)據(jù)轉(zhuǎn)換抽象模型
數(shù)據(jù)轉(zhuǎn)換抽象模型主要定義了源sheet、轉(zhuǎn)換目標(biāo)表、以及各目標(biāo)表源數(shù)據(jù)存儲區(qū)段序列。數(shù)據(jù)存儲區(qū)段序列由1~n個區(qū)段組成(區(qū)段是excel中一片連續(xù)的區(qū)域),每個區(qū)段由區(qū)段順序編號、起始列、終止列、起始行號、終止行號定義。終止行號為“dpm”意味著終止行需要依據(jù)不同年份每月所含日數(shù)不同計算而定。下表是氣溫(T)指標(biāo)的數(shù)據(jù)轉(zhuǎn)換抽象模型示例。其他指標(biāo)定義與此類似。
圖2 數(shù)據(jù)轉(zhuǎn)換抽象模型示例(氣溫T為例)
(1)數(shù)據(jù)轉(zhuǎn)換過程
循環(huán)處理各生態(tài)站(第一層循環(huán))、各年份(第二層循環(huán))、各指標(biāo)(第三層循環(huán))。
在各個指標(biāo)的循環(huán)中將當(dāng)前生態(tài)站、當(dāng)前年的1-12月excel數(shù)據(jù)進(jìn)行逐月順序處理,分別寫入小時值、日值、月值的合并后數(shù)據(jù)文件(例如T1.csv、T2.csv、T3.csv),并生成相應(yīng)的控制文件(例如T1.ctl、T2. ctl、T3. ctl)。寫入過程中進(jìn)行質(zhì)量控制,將“-”、“//”等符號去掉替換成空。
(2)數(shù)據(jù)入庫過程
將每年的所有生態(tài)站的報表源數(shù)據(jù)528個讀入內(nèi)存數(shù)組→進(jìn)行轉(zhuǎn)換(添加生態(tài)站代碼、年、月、日等信息)→然后合并后產(chǎn)生子指標(biāo)目標(biāo)表文件.csv。方法是:生成各個子指標(biāo)目標(biāo)表格的sqlldr命令控制文件和數(shù)據(jù)文件[12]。
采用Sqlldr命令將合并后數(shù)據(jù)文件裝入Oracle數(shù)據(jù)庫,最終共生成78張目標(biāo)表格:
例如氣溫日值表T2的控制文件T2.ctl(里面引用氣溫日值數(shù)據(jù)文件T2.csv)示例如下:
OPTIONS(SKIP=1,ROWS=16061)
LOAD DATA
INFILE "T2.csv"
insert into table T2
Fields terminated by ","
Optionally enclosed by '"'
trailing nullcols
(SSS000,YYYY00,MM0000,DD0000,MEAN00,MAX000,TIME10,MIN000,TIME20)
(1)數(shù)據(jù)轉(zhuǎn)換過程的并行化方法分析
通過整個轉(zhuǎn)換過程的流程分析,為了減少并行進(jìn)程之間的通信開銷、減少文件I/O次數(shù)及讀寫共享沖突,決定對指標(biāo)分門別類進(jìn)行并行化。因?yàn)镃ERN報表源按照其不同存儲格式可分為4類,分別編寫每類報表的轉(zhuǎn)換程序代碼,這些代碼分別作為函數(shù)傳遞給多進(jìn)程并行處理程序,從而使得程序并行處理實(shí)現(xiàn)快速轉(zhuǎn)換。4類程序包括:
● run_other程序處理氣溫、濕度、氣壓、降水、土壤溫度……等一類報表;
● run_W60_W10M程序處理1小時風(fēng)、10分鐘極大風(fēng)等一類報表;
● run_W2_W10A程序處理2分鐘平均風(fēng)、10分鐘平均風(fēng)等一類報表;
● run_Radi_D5程序處理輻射小時類數(shù)據(jù)一類報表。
以此類推,可擴(kuò)展處理所有類別報表。
(2)數(shù)據(jù)轉(zhuǎn)換函數(shù)代碼編寫
以run_other函數(shù)為例,其輸入?yún)?shù)為:報表源sheet名、生態(tài)站代碼、年份共三個參數(shù)。程序需要導(dǎo)入Pandas數(shù)據(jù)包(import pandas as pd)、Numpy數(shù)組包(import numpy as np)。Numpy(Numerical Python)數(shù)組包提供了python對多維數(shù)組對象的支持,但它缺少數(shù)據(jù)處理分析所需的許多快速工具,Pandas(Python Data Analysis Library)基于NumPy開發(fā),Pandas提供了大量快速便捷地處理大型數(shù)據(jù)集(比如Excel文件讀寫)所需的函數(shù)和方法,使得Python成為強(qiáng)大而高效的數(shù)據(jù)分析處理環(huán)境[13]。Numpy和Pandas二者結(jié)合起來可以非常方便地實(shí)現(xiàn)報表源數(shù)據(jù)到目標(biāo)數(shù)據(jù)文件的快速轉(zhuǎn)換。
代碼主體主要順序逐月處理12個月的數(shù)據(jù)報表源Excel文件,按照抽象數(shù)據(jù)模型將Excel文件的數(shù)據(jù)讀入內(nèi)存數(shù)組,并利用Numpy數(shù)組包進(jìn)行內(nèi)存數(shù)組的各種操作(插入行、列),然后將處理好的內(nèi)存數(shù)組寫到與數(shù)據(jù)字典結(jié)構(gòu)一致的.csv數(shù)據(jù)文件及相應(yīng)的控制文件.ctl。run_other函數(shù)主要用于溫度、濕度、氣壓、降水、土壤溫度等具有同樣格式的sheet的處理。
(3)并行化關(guān)鍵技術(shù)
實(shí)現(xiàn)“多進(jìn)程”編程首先要導(dǎo)入multiprocessing站點(diǎn)包,建立進(jìn)程池pool,并將待并行運(yùn)行的代碼以函數(shù)形式傳遞給進(jìn)程,實(shí)現(xiàn)動態(tài)映射任務(wù),從而實(shí)現(xiàn)并行。其核心代碼如下:
import multiprocessing as mp #-----導(dǎo)入多進(jìn)程支持模塊
from multiprocessing import Pool #-----導(dǎo)入多進(jìn)程支持模塊下的進(jìn)程池
通過建立多進(jìn)程mp的進(jìn)程池pool,可以提供指定數(shù)量的進(jìn)程供用戶調(diào)用,當(dāng)有新的請求提交到pool中時,如果池還沒有滿,就會創(chuàng)建一個新的進(jìn)程用來執(zhí)行該請求;如果池中的進(jìn)程數(shù)已經(jīng)達(dá)到規(guī)定最大值,那么該請求就會等待,直到池中有進(jìn)程結(jié)束,才會創(chuàng)建新的進(jìn)程來執(zhí)行它。
下面例子展示了對前3類報表進(jìn)行并行化處理的代碼片斷。
def apply_async(): #-------非阻塞并行
#-----處理所有年份的數(shù)據(jù),本次僅處理1年的數(shù)據(jù)
YEAR=[2014]
#-----所有生態(tài)站代碼,共44個生態(tài)站待處理SITE=["AKA","ASA","SJM","HLA","FKD","NMD","SYA","LCA","YCA","SPD","FQA","CWA","CSA","YGA","TYA","YTA","QYA","CBF","BJF","GGF","GGS","HTF","DHF","HSF","BNF","NMG","HBG","JZB","THL","DHL","DYB","SYB","CLD","MXF","ALF","LSA","LZD","ESD","HJA","SNF","DTM","BJU","QYF","PYL"]
#-----申請非阻塞式并行的進(jìn)程池,最大進(jìn)程數(shù)processes可設(shè)為1、2、4、8、16等。以處理8個指標(biāo)為例。維持執(zhí)行的進(jìn)程總數(shù)為processes,當(dāng)一個進(jìn)程執(zhí)行完畢后會添加新的進(jìn)程進(jìn)去
pool = mp.Pool(processes=4)
pool.apply_async(run_W60_W10M, ("W60",YEAR,SITE,), )
pool.apply_async (run_W60_W10M, ("W10M", YEAR,SITE,),)
pool.apply_async(run_W2_W10A, ("W2",YEAR, SITE,), )
pool.apply_async(run_W2_W10A, ("W10A", YEAR, SITE,), )
pool.apply_async(run_other, ("P",YEAR,SITE,), )
pool.apply_async(run_other, ("P0",YEAR,SITE,), )
pool.apply_async(run_other, ("R",YEAR,SITE,), )
pool.apply_async(run_other, ("Tg0",YEAR, SITE,), )
#-----關(guān)閉進(jìn)程池。調(diào)用join之前,先調(diào)用close函數(shù),執(zhí)行完close后不會有新的進(jìn)程加入到pool
pool.close()
pool.join() #-----主進(jìn)程阻塞,等待子進(jìn)程的退出,join方法要在close或terminate之后使用。
#-----啟動主程序,申請并行執(zhí)行
if __name__ == "__main__":
apply_async()
試驗(yàn)環(huán)境:4核Intel? Xeon? CPU E3-1225 v5,內(nèi)存16 GB,主頻3.30 GHz。Python版本2.7,處理44個生態(tài)站2014年的8個指標(biāo)數(shù)據(jù)。
采用上述非阻塞式并行的進(jìn)程池進(jìn)行并行轉(zhuǎn)換處理。最大進(jìn)程數(shù)processes分別設(shè)為1、2、4、8、16、32、64個進(jìn)程,對比測試并行運(yùn)行時間長度,以此比較并行化執(zhí)行效率,如圖5所示。
圖3 并行編程不同運(yùn)行效果比對
結(jié)果顯示:
(1)傳統(tǒng)串行運(yùn)行與并行一個進(jìn)程的執(zhí)行時間相差無幾,甚至并行一個進(jìn)程比串行執(zhí)行耗費(fèi)時間更長,原因是并行一個進(jìn)程時,計算機(jī)為多進(jìn)程處理建立進(jìn)程池開銷反而超過了串行進(jìn)程;
(2)并行處理顯著加快了處理效率,并行4個進(jìn)程的處理效率基本上是傳統(tǒng)串行的執(zhí)行效率的4倍。
(3)并行4個進(jìn)程時(實(shí)際上邏輯進(jìn)程已達(dá)8個,達(dá)到操作系統(tǒng)并行進(jìn)程最大數(shù)),此時轉(zhuǎn)換處理時間可達(dá)最少。隨后即使增加最大并行進(jìn)程數(shù),也不會減短程序耗費(fèi)時間,說明已達(dá)到計算機(jī)處理的極限;
(4)并行2個進(jìn)程時,此時CPU占比60%左 右,程序處理時間大約下降到并行一個進(jìn)程的處理時間的一半;
(5)并行4個進(jìn)程時(實(shí)際上邏輯進(jìn)程已達(dá)8個,達(dá)到操作系統(tǒng)并行最大數(shù)),此時CPU占比已近100%,達(dá)到計算機(jī)CPU的極限;
(6)串行或并行進(jìn)程數(shù)小于等于4個時,內(nèi)存占比幾乎不變,這是因?yàn)閮?nèi)存占比主要受單一指標(biāo)轉(zhuǎn)換處理時的內(nèi)存使用率(單一指標(biāo)數(shù)據(jù)量大?。┯绊?,和進(jìn)程數(shù)相關(guān)關(guān)系很??;反倒是并行進(jìn)程數(shù)大于16個時,內(nèi)存占比增加,主要受進(jìn)程數(shù)增多導(dǎo)致的進(jìn)程池本身內(nèi)存開銷增大的影響。
試驗(yàn)結(jié)果表明,利用新型編程語言Python的并行編程環(huán)境和python科學(xué)計算優(yōu)勢,可大幅提高氣象數(shù)據(jù)報表轉(zhuǎn)換程序的運(yùn)行效率,充分利用性能不斷提升的計算機(jī)硬件設(shè)備的潛力。本文使用的Python2.7未安裝Parallel Python包,故采用非阻塞式并行編程方法,此方案可充分利用單核CPU的計算能力,發(fā)揮多進(jìn)程優(yōu)勢,實(shí)現(xiàn)CERN氣象數(shù)據(jù)報表的高效處理。數(shù)據(jù)格式轉(zhuǎn)換操作是典型的數(shù)據(jù)密集型計算任務(wù),進(jìn)程間僅有少量指令通信,通信代價微乎其微,而各子進(jìn)程又單獨(dú)處理計算任務(wù),在沒有讀寫瓶頸制約的條件下,理論上并行轉(zhuǎn)換引擎可以達(dá)到子進(jìn)程數(shù)量正相關(guān)的加速比[14]。
未來如果使用Python3.4以上版本,可使用Parallel Python并行編程方法,就可將轉(zhuǎn)換程序運(yùn)行于SMP[15](即“對稱多處理Symmetrical Multi- Processing”技術(shù),單機(jī)多核)或集群環(huán)境上,方可充分利用多核CPU,更加依托多進(jìn)程優(yōu)勢實(shí)現(xiàn)CERN氣象數(shù)據(jù)報表的更高效處理。
[1] 楊萍, 于秀波, 莊緒亮, 牛棟. 中國科學(xué)院中國生態(tài)系統(tǒng)研究網(wǎng)絡(luò)(CERN)的現(xiàn)狀及未來發(fā)展思路[J]. 中國科學(xué)院院刊, 2008, 23(6): 555-561.
[2] 李曉京等. C++/CLR數(shù)據(jù)庫與Excel并行數(shù)據(jù)轉(zhuǎn)換技術(shù)研究[J]. 計算機(jī)技術(shù)與發(fā)展. 2013, 23(7): 155-162.
[3] 王志斌. 天氣雷達(dá)資料實(shí)時并行處理方法[J]. 計算機(jī)工程. 2009. 35(23): 255-257.
[4] 韓李濤, 劉海龍, 孔巧麗, 陽凡林. 基于多核計算環(huán)境的地貌暈渲并行算法[J]. 計算機(jī)應(yīng)用. 2017, 37(7): 1911- 1915, 1920.
[5] 蔡佳佳, 李名世, 鄭鋒. 多核微機(jī)基于OpenMP的并行計算[J]. 計算機(jī)技術(shù)與發(fā)展. 2007. 17(10): 87-91.
[6] 王晗. 基于多核環(huán)境下的多線程并行程序設(shè)計方法研究[D]. 鄭州: 中原工學(xué)院, 2014.
[7] 王磊. 并行計算技術(shù)綜述[J]. 信息技術(shù). 2012. 10: 112-115.
[8] 應(yīng)毅, 劉亞軍. MapReduce并行計算技術(shù)發(fā)展綜述[J]. 計算機(jī)系統(tǒng)應(yīng)用. 2014. 23(4): 1-6, 11.
[9] 楊霄翼. 基于Python的”地理處理”并行方案[J]. 地理信息世界. 2017. 24(6): 117-121.
[10] 熊瑋. 多核并行計算技術(shù)在電力系統(tǒng)短路計算中的應(yīng)用. 電力系統(tǒng)自動化. 2011. 35(8): 49-52.
[11] 中國生態(tài)系統(tǒng)研究網(wǎng)絡(luò). 生態(tài)系統(tǒng)大氣環(huán)境觀測規(guī)范[專著]。P125-129.
[12] 沈佩娟, 湯荷美. 1995. 數(shù)據(jù)庫管理及應(yīng)用開發(fā), 清華大學(xué)出版社, 206-221.
[13] 張若愚. Python科學(xué)計算(第2版)[M]. 北京: 清華大學(xué)出版社, 2016, 33-341.
[14] 張帥. 柵格地理數(shù)據(jù)并行格式轉(zhuǎn)換引擎[J]. 國防科技大學(xué)學(xué)報. 2015. 37(5): 9-14.
[15] 百度百科. SMP對稱多處理結(jié)構(gòu). https://baike.baidu.com/ item/SMP對稱多處理結(jié)構(gòu)/7213852.
An Application of Python-Based Parallel Programming in Batch Meteorological Excel Sheets’ Processing and Loading into Database
GUO Xue-bing
(Key Laboratory of Ecosystem Network Observation and Modeling, Institute of Geographic Sciences and Natural Resources Research, CAS, Beijing 100101)
In order to meet CERN’s (CERN is acronyms of Chinese Ecosystem Research Network) requirements of transforming batch meteorological Excel sheets quickly and loading into database in a high performance and efficiency, The author s tudy and compare several different parallel programming technologies at present, and Python-based parallel programming method is chosen as an approach to transform batch meteorological Excel sheets and load into Oracle database. Firstly the author build an abstract data model to describe data transform structure, then edit code using python-based multiprocessing parallel programming, at last the author analyze different transforming performance under condition of setting various parameters for multiprocessing parallel programming.The study result shows that python-based multiprocessing parallel programming method can fully utilize the computer ‘s hardware potential benchmark so as to promote the transform performance. Moreover, the method is quite simple and high efficient. The author suggest that Parallel Python package should be installed and imported, multi-core computers’ performance then could be utilized thoroughly to promote CERN’s data transforming performance much better in the future. This paper also provides a reference solution for other similar data transform requirement.
Chinese ecosystem research network; CERN; Python; Parallel programming; Multiprocessing; Meteorological sheet; Transform and load into database.
TP31
A
10.3969/j.issn.1003-6970.2018.07.005
中國科學(xué)院戰(zhàn)略性先導(dǎo)科技專項(A類)(XDA19020301)資助
郭學(xué)兵(1967-),女,副教授,主要研究方向:生態(tài)信息學(xué)。
本文著錄格式:郭學(xué)兵. 基于Python的并行編程技術(shù)在批量氣象規(guī)范報表入庫處理中的應(yīng)用[J]. 軟件,2018,39(7):24-29