999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Python的并行編程技術(shù)在批量氣象規(guī)范報(bào)表入庫(kù)處理中的應(yīng)用

2018-08-13 11:34:26郭學(xué)兵
軟件 2018年7期
關(guān)鍵詞:進(jìn)程生態(tài)

郭學(xué)兵

?

基于Python的并行編程技術(shù)在批量氣象規(guī)范報(bào)表入庫(kù)處理中的應(yīng)用

郭學(xué)兵

(中國(guó)科學(xué)院地理科學(xué)與資源研究所生態(tài)系統(tǒng)網(wǎng)絡(luò)觀測(cè)與模擬重點(diǎn)實(shí)驗(yàn)室,北京 100101)

為滿足中國(guó)生態(tài)系統(tǒng)研究網(wǎng)絡(luò)(英文全稱Chinese Ecosystem Research Network,簡(jiǎn)稱CERN)對(duì)大批量氣象規(guī)范報(bào)表(Excel格式)進(jìn)行高效快速轉(zhuǎn)換并載入數(shù)據(jù)庫(kù)的需求,作者在對(duì)當(dāng)前流行的并行編程方法和技術(shù)進(jìn)行對(duì)比研究的基礎(chǔ)上,提出了利用Python的多進(jìn)程編程技術(shù)實(shí)現(xiàn)報(bào)表處理的方案,建立了CERN氣象規(guī)范報(bào)表的抽象數(shù)據(jù)轉(zhuǎn)換模型,并編寫(xiě)了多進(jìn)程并行處理程序,實(shí)現(xiàn)了將大批量氣象報(bào)表的快速轉(zhuǎn)換載入Oracle數(shù)據(jù)庫(kù)的功能。同時(shí),作者對(duì)多進(jìn)程編程的不同參數(shù)設(shè)置情景下的轉(zhuǎn)換效率進(jìn)行了測(cè)試、比較和分析。實(shí)驗(yàn)結(jié)果顯示,利用Python并行編程技術(shù)可以充分利用計(jì)算機(jī)硬件的潛力和性能,從而大大提高處理效率,且方法簡(jiǎn)便、事半功倍。作者最后進(jìn)一步建議通過(guò)利用Parallel Python軟件包,可更充分利用計(jì)算機(jī)多核性能,更大程度提高處理效率。更加滿足CERN日益增長(zhǎng)的數(shù)據(jù)快速處理需求。同時(shí)本文為類(lèi)似數(shù)據(jù)處理需求提供了可借鑒的參考方案。

中國(guó)生態(tài)系統(tǒng)研究網(wǎng)絡(luò);CERN;python;并行編程;多進(jìn)程;氣象;報(bào)表;轉(zhuǎn)換入庫(kù)

0 引言

中國(guó)生態(tài)系統(tǒng)研究網(wǎng)絡(luò)(英文全稱Chinese Ecosystem Research Network,簡(jiǎn)稱CERN)始建于1988年。目前,CERN包含覆蓋全國(guó)主要類(lèi)型區(qū)(農(nóng)田、森林、草原、荒漠、濕地、湖泊、海灣生態(tài)系統(tǒng)等)共計(jì)44個(gè)野外生態(tài)站,另有水分、土壤、大氣等5個(gè)學(xué)科分中心和1個(gè)綜合中心。CERN與美國(guó)長(zhǎng)期生態(tài)研究網(wǎng)絡(luò)(US LTER Network)和英國(guó)環(huán)境變化網(wǎng)絡(luò)(ECN)并列成為世界最為重要的國(guó)家級(jí)生態(tài)系統(tǒng)網(wǎng)絡(luò),是中國(guó)生態(tài)學(xué)領(lǐng)域的重要觀測(cè)、研究、示范基地[1]。

CERN以野外生態(tài)站為基礎(chǔ)單元開(kāi)展各類(lèi)生態(tài)系統(tǒng)中水分、土壤、生物、大氣環(huán)境要素的長(zhǎng)期觀測(cè),產(chǎn)生的數(shù)據(jù)由相關(guān)各方(產(chǎn)生者—生態(tài)站,質(zhì)量控制者—學(xué)科分中心,數(shù)據(jù)集成者—綜合中心)按照統(tǒng)一規(guī)定的數(shù)據(jù)監(jiān)測(cè)規(guī)范及信息規(guī)范,對(duì)數(shù)據(jù)進(jìn)行相應(yīng)處理并實(shí)現(xiàn)生態(tài)站-分中心-綜合中心逐級(jí)質(zhì)量控制和數(shù)據(jù)報(bào)送。綜合中心是所有生態(tài)站、各類(lèi)環(huán)境要素?cái)?shù)據(jù)的最終集成單位,因此綜合中心必須通過(guò)開(kāi)發(fā)軟件系統(tǒng),實(shí)現(xiàn)這些數(shù)據(jù)的快速處理、入庫(kù)及網(wǎng)上發(fā)布共享等整套業(yè)務(wù)的長(zhǎng)期穩(wěn)定運(yùn)行,以便為我國(guó)生態(tài)與環(huán)境保護(hù)、資源合理利用和國(guó)家可持續(xù)發(fā)展及應(yīng)對(duì)全球變化等提供長(zhǎng)期、系統(tǒng)的科學(xué)數(shù)據(jù)和決策依據(jù)[1]。

CERN傳統(tǒng)氣象數(shù)據(jù)報(bào)表轉(zhuǎn)換入庫(kù)處理程序采用微軟Windows環(huán)境下OFFICE COM對(duì)象(Component Object Model)的面向?qū)ο缶幊谭椒ǎ贛icrosoft Visual Foxpro6.0編程環(huán)境下實(shí)現(xiàn)對(duì)Excel文件的讀寫(xiě)(顯式或隱式運(yùn)行Excel 應(yīng)用,操作工作薄、工作表對(duì)象,實(shí)現(xiàn)數(shù)據(jù)存取操作等),實(shí)現(xiàn)從Excel數(shù)據(jù)到VFP數(shù)據(jù)庫(kù)表(.dbf文件)的數(shù)據(jù)移動(dòng)[2]。然后再將.dbf文件數(shù)據(jù)表升遷到Oracle數(shù)據(jù)庫(kù)。

這種傳統(tǒng)的數(shù)據(jù)處理方法需要不斷地進(jìn)行I/O處理,因此造成處理時(shí)間過(guò)長(zhǎng)[3],不能充分利用計(jì)算機(jī)性能,導(dǎo)致數(shù)據(jù)處理效率低下(CERN單一指標(biāo)的數(shù)據(jù)處理大約耗費(fèi)半小時(shí))。

隨著CERN野外生態(tài)站個(gè)數(shù)、監(jiān)測(cè)指標(biāo)個(gè)數(shù)不斷增加等情況出現(xiàn),數(shù)據(jù)采集正朝著海量化方向發(fā)展,這對(duì)數(shù)據(jù)處理和質(zhì)量控制的效率提出了更高挑戰(zhàn);同時(shí),計(jì)算機(jī)硬件技術(shù)也日新月異地發(fā)展,處理器性能不斷提高,且多核處理器已成為當(dāng)前處理器技術(shù)的發(fā)展方向,這些硬件變化的同時(shí)引領(lǐng)軟件研發(fā)發(fā)生了基礎(chǔ)性變化。基于多核的并行處理是充分發(fā)揮多核CPU強(qiáng)大運(yùn)算能力的有效途徑,并行計(jì)算模式正成為當(dāng)前及未來(lái)程序開(kāi)發(fā)的發(fā)展趨勢(shì),具有十分廣闊的應(yīng)用價(jià)值[4]。

傳統(tǒng)程序基本上是為順序處理器書(shū)寫(xiě)的,大部分程序在多處理器上不能直接獲得加速,不再適應(yīng)新形勢(shì)下的數(shù)據(jù)處理需求。解決這一問(wèn)題的途徑之一是使用多處理器并行處理技術(shù)把順序程序轉(zhuǎn)換為并行程序[5],才能充分利用目前多核計(jì)算機(jī)等提供的計(jì)算資源等。

本文主要針對(duì)CERN生態(tài)站大批量的由自動(dòng)氣象觀測(cè)站采集的固定格式Excel數(shù)據(jù)報(bào)表,進(jìn)行快速轉(zhuǎn)換并入庫(kù)的并行處理技術(shù)方法進(jìn)行分析、研究、實(shí)踐驗(yàn)證。作者首先對(duì)當(dāng)前流行的并行編程方法和技術(shù)進(jìn)行了對(duì)比研究,提出了基于Python多進(jìn)程編程技術(shù)實(shí)現(xiàn)報(bào)表轉(zhuǎn)換入庫(kù)的構(gòu)。然后建立了CERN氣象規(guī)范報(bào)表的抽象數(shù)據(jù)轉(zhuǎn)換模型,利用Python2.7編寫(xiě)了多進(jìn)程并行程序,實(shí)現(xiàn)了氣象規(guī)范報(bào)表的快速轉(zhuǎn)換及載入Oracle數(shù)據(jù)庫(kù)功能,并對(duì)多進(jìn)程編程的不同參數(shù)設(shè)置情景下的轉(zhuǎn)換效率進(jìn)行了比較和分析。結(jié)果表明基于Python的并行處理技術(shù)極大提升了應(yīng)用程序的運(yùn)行效率,充分發(fā)揮了計(jì)算機(jī)硬件性能。

1 多線程并行程序設(shè)計(jì)方法概述

根據(jù)對(duì)并行處理技術(shù)的綜述性文獻(xiàn)內(nèi)容進(jìn)行歸納總結(jié),多線程并行程序設(shè)計(jì)方法目前主要包括以下幾種[6]:

(1)顯示線程編程

并行編程可以調(diào)用系統(tǒng)函數(shù)啟動(dòng)多線程,例如:Pthreads、Java線程類(lèi)、微軟Widows線程API。

(2)利用并行編程模型的編譯器指導(dǎo)的編程

? OpenMP:OpenMP是一種面向共享內(nèi)存的多處理器多線程并行編程模型,為在共享存儲(chǔ)的多處理機(jī)上編寫(xiě)并行程序而設(shè)計(jì)的應(yīng)用編程接口,運(yùn)行在單機(jī)多核并行計(jì)算環(huán)境下。由一個(gè)小型的編譯器命令集組成,包括一套編譯制導(dǎo)語(yǔ)句和一個(gè)用來(lái)支持它的函數(shù)庫(kù)。OpenMP 的編程模型以線程為基礎(chǔ),通過(guò)編譯指導(dǎo)語(yǔ)句來(lái)顯示地指導(dǎo)共享內(nèi)存的多線程并行化,為編程人員提供了并行化的完整控制。通過(guò)與標(biāo)準(zhǔn)Fortran,C和C ++結(jié)合進(jìn)行編程[5]

? Intel TBB:Intel Thread Building Block編譯器

(3)利用并行應(yīng)用庫(kù)編程

? Intel IPPMKL,ScalaPACK、PARDISO

? MPI:MPI(Message Passing Interface)是基于消息傳遞的并行編程模型。消息傳遞指的是并行執(zhí)行的各個(gè)進(jìn)程具有自己獨(dú)立的堆棧和代碼段,作為互不相關(guān)的多個(gè)程序獨(dú)立執(zhí)行,進(jìn)程之間的通信通過(guò)顯式地調(diào)用通信函數(shù)來(lái)完成[7]。它用于非共享內(nèi)存(即分布式共享內(nèi)存)的集群計(jì)算環(huán)境,是用于計(jì)算機(jī)集群的編程技術(shù)。

(4)并行程序語(yǔ)言編程

目前有150種以上并行編程語(yǔ)言,其中Python是著名的一種并行程序開(kāi)發(fā)語(yǔ)言,有進(jìn)程池概念,不用自己創(chuàng)建進(jìn)程。

(5)MapReduce

MapReduce是一種基于Google云計(jì)算平臺(tái)的分布式編程模型,其云計(jì)算基礎(chǔ)架構(gòu)包括3個(gè)相互獨(dú)立又緊密結(jié)合的系統(tǒng)(分布式文件系統(tǒng)GFS、并行編程模型和任務(wù)調(diào)度模型MapReduce、處理結(jié)構(gòu)化以及半結(jié)構(gòu)化數(shù)據(jù)的大規(guī)模分布式數(shù)據(jù)庫(kù)Bigtable)。Apache Hadoop是一種由Java語(yǔ)言編寫(xiě)的運(yùn)行在Linux 操作系統(tǒng)之上的開(kāi)源云計(jì)算平臺(tái),由HDFS(Hadoop Distribute File System)和Hadoop MapReduce 兩個(gè)核心部件組成,二者分別是GFS 和Google MapReduce的開(kāi)源實(shí)現(xiàn),Hadoop目前已經(jīng)成為大數(shù)據(jù)領(lǐng)域事實(shí)上的標(biāo)準(zhǔn)[8]。

綜上所述,目前并行程序設(shè)計(jì)方法非常多樣化,而且仍處于不斷發(fā)展之中,并無(wú)固定不變的定式。并行程序設(shè)計(jì)方法支持不同的開(kāi)發(fā)環(huán)境,開(kāi)發(fā)復(fù)雜度及開(kāi)發(fā)成本相異,適宜處理不同規(guī)模及特征的數(shù)據(jù)與處理方法,可分別滿足不同的并行處理流程、應(yīng)用場(chǎng)景需求。

本文重點(diǎn)討論應(yīng)用Python面向?qū)ο蟮膭?dòng)態(tài)的高級(jí)程序設(shè)計(jì)語(yǔ)言,基于其并行程序編程方法以及強(qiáng)大科學(xué)計(jì)算功能而開(kāi)發(fā)并行處理程序,實(shí)現(xiàn)CERN批量氣象規(guī)范報(bào)表的快速轉(zhuǎn)換入庫(kù)的方法和技術(shù)。

2 Python并行編程

Python是一種模塊化設(shè)計(jì)的,具有簡(jiǎn)潔和高可讀性語(yǔ)法的高級(jí)編程語(yǔ)言,且支持多種方式的并行編程。基于Python語(yǔ)言的并行編程技術(shù)發(fā)展至今,形成了5種模式,分別是:異步編程模式、分布式并行模式、GPU并行模式、基于多線程的并行模式和基于多進(jìn)程的并行模式。其中,異步編程模式適用于因復(fù)雜任務(wù)中的子任務(wù)爭(zhēng)奪運(yùn)算資源,而需要在程序運(yùn)行期間協(xié)調(diào)CPU使用權(quán)的情況;分布式并行模式應(yīng)用于集群運(yùn)算;GPU并行模式則應(yīng)用于圖4形及科學(xué)運(yùn)算。這兩種模式均不適合CERN的氣象數(shù)據(jù)報(bào)表轉(zhuǎn)換處理的應(yīng)用需求[9]。而“多線程”和“多進(jìn)程”是可用于CERN氣象規(guī)范報(bào)表轉(zhuǎn)換處理并行化運(yùn)行的主要實(shí)現(xiàn)方式。

Python由于全局鎖GIL(Global Interpreter Lock)的存在,Python中的多線程其實(shí)并不是真正的多線程,Python的多線程不是并行執(zhí)行(物理上同時(shí)發(fā)生)而是并發(fā)執(zhí)行(輪換執(zhí)行,邏輯上同時(shí)發(fā)生),還不能利用多核CPU[10]。如果想要充分使用多核CPU的資源,Python3.4中的 Parallel Python包可支持多CPU并行計(jì)算。

在Python2.7中使用多進(jìn)程,它通過(guò)采用子進(jìn)程的技術(shù)避開(kāi)GIL,使用multiprocessing進(jìn)行多進(jìn)程編程提高程序效率。Python提供了非常好用的多進(jìn)程包multiprocessing,可輕松完成從單進(jìn)程到并發(fā)執(zhí)行的轉(zhuǎn)換,只需要編程人員定義一個(gè)函數(shù),Python會(huì)完成其他所有事情。Multiprocessing支持子進(jìn)程、通信和共享數(shù)據(jù)、支持執(zhí)行不同方式的同步,提供了Process、Queue、Pipe、Lock等組件來(lái)支持對(duì)程序并行化的控制。

3 CERN氣象規(guī)范報(bào)表數(shù)據(jù)處理流程及并行化方法分析

3.1 數(shù)據(jù)轉(zhuǎn)換抽象模型

(1)待處理報(bào)表源文件(from_Sheet)

待處理的CERN氣象規(guī)范報(bào)表每年包含待528個(gè)待處理文件(每年44個(gè)生態(tài)站,12個(gè)月/生態(tài)站),每個(gè)excel文件中包含共計(jì)26個(gè)指標(biāo)的sheet,分別存儲(chǔ)氣溫(T)、氣壓(P)、海平面氣壓(P0)、降水(R)、相對(duì)濕度(RH)、地表溫度(Tg0)、1小時(shí)風(fēng)速(W60)、10分鐘極大風(fēng)速(W10M)、2分鐘平均風(fēng)速(W2)、10分鐘平均風(fēng)速(W10A)等指標(biāo)的每月儀器自動(dòng)記錄的各日逐時(shí)數(shù)據(jù)、逐日數(shù)據(jù)(日最高、日平均、日最低等)、逐月數(shù)據(jù)(月最高、月平均、月最低等)等子指標(biāo)[11]。

Excel文件命名方式:3位臺(tái)站代碼+4位年份+2位月份。例如AKA201401.xls表示阿克蘇站2014年1月的觀測(cè)數(shù)據(jù)文件。

(2)轉(zhuǎn)換目標(biāo)表(to_Table)

每個(gè)指標(biāo)的sheet數(shù)據(jù)將被轉(zhuǎn)換分解為三個(gè)有待載入Oracle數(shù)據(jù)庫(kù)表的子指標(biāo),例如氣溫(T)sheet最終將被轉(zhuǎn)換為3個(gè)子指標(biāo):小時(shí)尺度氣溫(T1)、日尺度氣溫(T2)、月尺度氣溫(T3),它們分別是二維關(guān)系數(shù)據(jù)表的格式,其數(shù)據(jù)項(xiàng)的說(shuō)明字典如下:

表代碼及表名稱列代碼及其中文含義 T1(自動(dòng)站每日逐時(shí)氣溫表)代碼SSS000YYYY00MM0000DD0000T102T104T106T108T110……T148 中文含義臺(tái)站代碼年月日21時(shí)22時(shí)23時(shí)24時(shí)1時(shí)……20時(shí) T2(自動(dòng)站逐日氣溫)代碼SSS000YYYY00MM0000DD0000MEAN00MAX000TIME10MIN000TIME20 中文含義臺(tái)站代碼年月日日平均值日最大值日最大值出現(xiàn)時(shí)間日最小值日最小值出現(xiàn)時(shí)間 T3(自動(dòng)站逐月氣溫)代碼SSS000YYYY00MM0000T302T304T306MAX000TIME10MIN000TIME20 中文含義臺(tái)站代碼年月月平均日最大值月平均日最小值月平均月極大值月極大值出現(xiàn)日期月極小值月極小值出現(xiàn)日期

(3)數(shù)據(jù)轉(zhuǎn)換抽象模型

數(shù)據(jù)轉(zhuǎn)換抽象模型主要定義了源sheet、轉(zhuǎn)換目標(biāo)表、以及各目標(biāo)表源數(shù)據(jù)存儲(chǔ)區(qū)段序列。數(shù)據(jù)存儲(chǔ)區(qū)段序列由1~n個(gè)區(qū)段組成(區(qū)段是excel中一片連續(xù)的區(qū)域),每個(gè)區(qū)段由區(qū)段順序編號(hào)、起始列、終止列、起始行號(hào)、終止行號(hào)定義。終止行號(hào)為“dpm”意味著終止行需要依據(jù)不同年份每月所含日數(shù)不同計(jì)算而定。下表是氣溫(T)指標(biāo)的數(shù)據(jù)轉(zhuǎn)換抽象模型示例。其他指標(biāo)定義與此類(lèi)似。

圖2 數(shù)據(jù)轉(zhuǎn)換抽象模型示例(氣溫T為例)

3.2 數(shù)據(jù)轉(zhuǎn)換入庫(kù)方法和流程

(1)數(shù)據(jù)轉(zhuǎn)換過(guò)程

循環(huán)處理各生態(tài)站(第一層循環(huán))、各年份(第二層循環(huán))、各指標(biāo)(第三層循環(huán))。

在各個(gè)指標(biāo)的循環(huán)中將當(dāng)前生態(tài)站、當(dāng)前年的1-12月excel數(shù)據(jù)進(jìn)行逐月順序處理,分別寫(xiě)入小時(shí)值、日值、月值的合并后數(shù)據(jù)文件(例如T1.csv、T2.csv、T3.csv),并生成相應(yīng)的控制文件(例如T1.ctl、T2. ctl、T3. ctl)。寫(xiě)入過(guò)程中進(jìn)行質(zhì)量控制,將“-”、“//”等符號(hào)去掉替換成空。

(2)數(shù)據(jù)入庫(kù)過(guò)程

將每年的所有生態(tài)站的報(bào)表源數(shù)據(jù)528個(gè)讀入內(nèi)存數(shù)組→進(jìn)行轉(zhuǎn)換(添加生態(tài)站代碼、年、月、日等信息)→然后合并后產(chǎn)生子指標(biāo)目標(biāo)表文件.csv。方法是:生成各個(gè)子指標(biāo)目標(biāo)表格的sqlldr命令控制文件和數(shù)據(jù)文件[12]。

采用Sqlldr命令將合并后數(shù)據(jù)文件裝入Oracle數(shù)據(jù)庫(kù),最終共生成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)

3.3 處理流程并行化分析及其關(guān)鍵技術(shù)

(1)數(shù)據(jù)轉(zhuǎn)換過(guò)程的并行化方法分析

通過(guò)整個(gè)轉(zhuǎn)換過(guò)程的流程分析,為了減少并行進(jìn)程之間的通信開(kāi)銷(xiāo)、減少文件I/O次數(shù)及讀寫(xiě)共享沖突,決定對(duì)指標(biāo)分門(mén)別類(lèi)進(jìn)行并行化。因?yàn)镃ERN報(bào)表源按照其不同存儲(chǔ)格式可分為4類(lèi),分別編寫(xiě)每類(lèi)報(bào)表的轉(zhuǎn)換程序代碼,這些代碼分別作為函數(shù)傳遞給多進(jìn)程并行處理程序,從而使得程序并行處理實(shí)現(xiàn)快速轉(zhuǎn)換。4類(lèi)程序包括:

● run_other程序處理氣溫、濕度、氣壓、降水、土壤溫度……等一類(lèi)報(bào)表;

● run_W60_W10M程序處理1小時(shí)風(fēng)、10分鐘極大風(fēng)等一類(lèi)報(bào)表;

● run_W2_W10A程序處理2分鐘平均風(fēng)、10分鐘平均風(fēng)等一類(lèi)報(bào)表;

● run_Radi_D5程序處理輻射小時(shí)類(lèi)數(shù)據(jù)一類(lèi)報(bào)表。

以此類(lèi)推,可擴(kuò)展處理所有類(lèi)別報(bào)表。

(2)數(shù)據(jù)轉(zhuǎn)換函數(shù)代碼編寫(xiě)

以run_other函數(shù)為例,其輸入?yún)?shù)為:報(bào)表源sheet名、生態(tài)站代碼、年份共三個(gè)參數(shù)。程序需要導(dǎo)入Pandas數(shù)據(jù)包(import pandas as pd)、Numpy數(shù)組包(import numpy as np)。Numpy(Numerical Python)數(shù)組包提供了python對(duì)多維數(shù)組對(duì)象的支持,但它缺少數(shù)據(jù)處理分析所需的許多快速工具,Pandas(Python Data Analysis Library)基于NumPy開(kāi)發(fā),Pandas提供了大量快速便捷地處理大型數(shù)據(jù)集(比如Excel文件讀寫(xiě))所需的函數(shù)和方法,使得Python成為強(qiáng)大而高效的數(shù)據(jù)分析處理環(huán)境[13]。Numpy和Pandas二者結(jié)合起來(lái)可以非常方便地實(shí)現(xiàn)報(bào)表源數(shù)據(jù)到目標(biāo)數(shù)據(jù)文件的快速轉(zhuǎn)換。

代碼主體主要順序逐月處理12個(gè)月的數(shù)據(jù)報(bào)表源Excel文件,按照抽象數(shù)據(jù)模型將Excel文件的數(shù)據(jù)讀入內(nèi)存數(shù)組,并利用Numpy數(shù)組包進(jìn)行內(nèi)存數(shù)組的各種操作(插入行、列),然后將處理好的內(nèi)存數(shù)組寫(xiě)到與數(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)動(dòng)態(tài)映射任務(wù),從而實(shí)現(xiàn)并行。其核心代碼如下:

import multiprocessing as mp #-----導(dǎo)入多進(jìn)程支持模塊

from multiprocessing import Pool #-----導(dǎo)入多進(jìn)程支持模塊下的進(jìn)程池

通過(guò)建立多進(jìn)程mp的進(jìn)程池pool,可以提供指定數(shù)量的進(jìn)程供用戶調(diào)用,當(dāng)有新的請(qǐng)求提交到pool中時(shí),如果池還沒(méi)有滿,就會(huì)創(chuàng)建一個(gè)新的進(jìn)程用來(lái)執(zhí)行該請(qǐng)求;如果池中的進(jìn)程數(shù)已經(jīng)達(dá)到規(guī)定最大值,那么該請(qǐng)求就會(huì)等待,直到池中有進(jìn)程結(jié)束,才會(huì)創(chuàng)建新的進(jìn)程來(lái)執(zhí)行它。

下面例子展示了對(duì)前3類(lèi)報(bào)表進(jìn)行并行化處理的代碼片斷。

def apply_async(): #-------非阻塞并行

#-----處理所有年份的數(shù)據(jù),本次僅處理1年的數(shù)據(jù)

YEAR=[2014]

#-----所有生態(tài)站代碼,共44個(gè)生態(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"]

#-----申請(qǐng)非阻塞式并行的進(jìn)程池,最大進(jìn)程數(shù)processes可設(shè)為1、2、4、8、16等。以處理8個(gè)指標(biāo)為例。維持執(zhí)行的進(jìn)程總數(shù)為processes,當(dāng)一個(gè)進(jìn)程執(zhí)行完畢后會(huì)添加新的進(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后不會(huì)有新的進(jìn)程加入到pool

pool.close()

pool.join() #-----主進(jìn)程阻塞,等待子進(jìn)程的退出,join方法要在close或terminate之后使用。

#-----啟動(dòng)主程序,申請(qǐng)并行執(zhí)行

if __name__ == "__main__":

apply_async()

4 并行編程運(yùn)行效果分析

試驗(yàn)環(huán)境:4核Intel? Xeon? CPU E3-1225 v5,內(nèi)存16 GB,主頻3.30 GHz。Python版本2.7,處理44個(gè)生態(tài)站2014年的8個(gè)指標(biāo)數(shù)據(jù)。

采用上述非阻塞式并行的進(jìn)程池進(jìn)行并行轉(zhuǎn)換處理。最大進(jìn)程數(shù)processes分別設(shè)為1、2、4、8、16、32、64個(gè)進(jìn)程,對(duì)比測(cè)試并行運(yùn)行時(shí)間長(zhǎng)度,以此比較并行化執(zhí)行效率,如圖5所示。

圖3 并行編程不同運(yùn)行效果比對(duì)

結(jié)果顯示:

(1)傳統(tǒng)串行運(yùn)行與并行一個(gè)進(jìn)程的執(zhí)行時(shí)間相差無(wú)幾,甚至并行一個(gè)進(jìn)程比串行執(zhí)行耗費(fèi)時(shí)間更長(zhǎng),原因是并行一個(gè)進(jìn)程時(shí),計(jì)算機(jī)為多進(jìn)程處理建立進(jìn)程池開(kāi)銷(xiāo)反而超過(guò)了串行進(jìn)程;

(2)并行處理顯著加快了處理效率,并行4個(gè)進(jìn)程的處理效率基本上是傳統(tǒng)串行的執(zhí)行效率的4倍。

(3)并行4個(gè)進(jìn)程時(shí)(實(shí)際上邏輯進(jìn)程已達(dá)8個(gè),達(dá)到操作系統(tǒng)并行進(jìn)程最大數(shù)),此時(shí)轉(zhuǎn)換處理時(shí)間可達(dá)最少。隨后即使增加最大并行進(jìn)程數(shù),也不會(huì)減短程序耗費(fèi)時(shí)間,說(shuō)明已達(dá)到計(jì)算機(jī)處理的極限;

(4)并行2個(gè)進(jìn)程時(shí),此時(shí)CPU占比60%左 右,程序處理時(shí)間大約下降到并行一個(gè)進(jìn)程的處理時(shí)間的一半;

(5)并行4個(gè)進(jìn)程時(shí)(實(shí)際上邏輯進(jìn)程已達(dá)8個(gè),達(dá)到操作系統(tǒng)并行最大數(shù)),此時(shí)CPU占比已近100%,達(dá)到計(jì)算機(jī)CPU的極限;

(6)串行或并行進(jìn)程數(shù)小于等于4個(gè)時(shí),內(nèi)存占比幾乎不變,這是因?yàn)閮?nèi)存占比主要受單一指標(biāo)轉(zhuǎn)換處理時(shí)的內(nèi)存使用率(單一指標(biāo)數(shù)據(jù)量大小)影響,和進(jìn)程數(shù)相關(guān)關(guān)系很小;反倒是并行進(jìn)程數(shù)大于16個(gè)時(shí),內(nèi)存占比增加,主要受進(jìn)程數(shù)增多導(dǎo)致的進(jìn)程池本身內(nèi)存開(kāi)銷(xiāo)增大的影響。

5 結(jié)語(yǔ)

試驗(yàn)結(jié)果表明,利用新型編程語(yǔ)言Python的并行編程環(huán)境和python科學(xué)計(jì)算優(yōu)勢(shì),可大幅提高氣象數(shù)據(jù)報(bào)表轉(zhuǎn)換程序的運(yùn)行效率,充分利用性能不斷提升的計(jì)算機(jī)硬件設(shè)備的潛力。本文使用的Python2.7未安裝Parallel Python包,故采用非阻塞式并行編程方法,此方案可充分利用單核CPU的計(jì)算能力,發(fā)揮多進(jìn)程優(yōu)勢(shì),實(shí)現(xiàn)CERN氣象數(shù)據(jù)報(bào)表的高效處理。數(shù)據(jù)格式轉(zhuǎn)換操作是典型的數(shù)據(jù)密集型計(jì)算任務(wù),進(jìn)程間僅有少量指令通信,通信代價(jià)微乎其微,而各子進(jìn)程又單獨(dú)處理計(jì)算任務(wù),在沒(méi)有讀寫(xiě)瓶頸制約的條件下,理論上并行轉(zhuǎn)換引擎可以達(dá)到子進(jìn)程數(shù)量正相關(guān)的加速比[14]。

未來(lái)如果使用Python3.4以上版本,可使用Parallel Python并行編程方法,就可將轉(zhuǎn)換程序運(yùn)行于SMP[15](即“對(duì)稱多處理Symmetrical Multi- Processing”技術(shù),單機(jī)多核)或集群環(huán)境上,方可充分利用多核CPU,更加依托多進(jìn)程優(yōu)勢(shì)實(shí)現(xiàn)CERN氣象數(shù)據(jù)報(bào)表的更高效處理。

[1] 楊萍, 于秀波, 莊緒亮, 牛棟. 中國(guó)科學(xué)院中國(guó)生態(tài)系統(tǒng)研究網(wǎng)絡(luò)(CERN)的現(xiàn)狀及未來(lái)發(fā)展思路[J]. 中國(guó)科學(xué)院院刊, 2008, 23(6): 555-561.

[2] 李曉京等. C++/CLR數(shù)據(jù)庫(kù)與Excel并行數(shù)據(jù)轉(zhuǎn)換技術(shù)研究[J]. 計(jì)算機(jī)技術(shù)與發(fā)展. 2013, 23(7): 155-162.

[3] 王志斌. 天氣雷達(dá)資料實(shí)時(shí)并行處理方法[J]. 計(jì)算機(jī)工程. 2009. 35(23): 255-257.

[4] 韓李濤, 劉海龍, 孔巧麗, 陽(yáng)凡林. 基于多核計(jì)算環(huán)境的地貌暈渲并行算法[J]. 計(jì)算機(jī)應(yīng)用. 2017, 37(7): 1911- 1915, 1920.

[5] 蔡佳佳, 李名世, 鄭鋒. 多核微機(jī)基于OpenMP的并行計(jì)算[J]. 計(jì)算機(jī)技術(shù)與發(fā)展. 2007. 17(10): 87-91.

[6] 王晗. 基于多核環(huán)境下的多線程并行程序設(shè)計(jì)方法研究[D]. 鄭州: 中原工學(xué)院, 2014.

[7] 王磊. 并行計(jì)算技術(shù)綜述[J]. 信息技術(shù). 2012. 10: 112-115.

[8] 應(yīng)毅, 劉亞軍. MapReduce并行計(jì)算技術(shù)發(fā)展綜述[J]. 計(jì)算機(jī)系統(tǒng)應(yīng)用. 2014. 23(4): 1-6, 11.

[9] 楊霄翼. 基于Python的”地理處理”并行方案[J]. 地理信息世界. 2017. 24(6): 117-121.

[10] 熊瑋. 多核并行計(jì)算技術(shù)在電力系統(tǒng)短路計(jì)算中的應(yīng)用. 電力系統(tǒng)自動(dòng)化. 2011. 35(8): 49-52.

[11] 中國(guó)生態(tài)系統(tǒng)研究網(wǎng)絡(luò). 生態(tài)系統(tǒng)大氣環(huán)境觀測(cè)規(guī)范[專著]。P125-129.

[12] 沈佩娟, 湯荷美. 1995. 數(shù)據(jù)庫(kù)管理及應(yīng)用開(kāi)發(fā), 清華大學(xué)出版社, 206-221.

[13] 張若愚. Python科學(xué)計(jì)算(第2版)[M]. 北京: 清華大學(xué)出版社, 2016, 33-341.

[14] 張帥. 柵格地理數(shù)據(jù)并行格式轉(zhuǎn)換引擎[J]. 國(guó)防科技大學(xué)學(xué)報(bào). 2015. 37(5): 9-14.

[15] 百度百科. SMP對(duì)稱多處理結(jié)構(gòu). https://baike.baidu.com/ item/SMP對(duì)稱多處理結(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

中國(guó)科學(xué)院戰(zhàn)略性先導(dǎo)科技專項(xiàng)(A類(lèi))(XDA19020301)資助

郭學(xué)兵(1967-),女,副教授,主要研究方向:生態(tài)信息學(xué)。

本文著錄格式:郭學(xué)兵. 基于Python的并行編程技術(shù)在批量氣象規(guī)范報(bào)表入庫(kù)處理中的應(yīng)用[J]. 軟件,2018,39(7):24-29

猜你喜歡
進(jìn)程生態(tài)
“生態(tài)養(yǎng)生”娛晚年
住進(jìn)呆萌生態(tài)房
生態(tài)之旅
生態(tài)之旅
生態(tài)之旅
債券市場(chǎng)對(duì)外開(kāi)放的進(jìn)程與展望
生態(tài)
我國(guó)高等教育改革進(jìn)程與反思
Linux僵死進(jìn)程的產(chǎn)生與避免
男女平等進(jìn)程中出現(xiàn)的新矛盾和新問(wèn)題
主站蜘蛛池模板: 狠狠久久综合伊人不卡| 中文字幕免费播放| 好吊色国产欧美日韩免费观看| 亚洲性影院| 免费可以看的无遮挡av无码| 综合色在线| 在线毛片网站| 国产第一页免费浮力影院| 玖玖精品视频在线观看| 久草中文网| 91丝袜在线观看| 成人午夜久久| h网址在线观看| 亚洲 欧美 日韩综合一区| 成人va亚洲va欧美天堂| 国产亚洲视频播放9000| 免费a在线观看播放| 色国产视频| 国产精品免费电影| 色婷婷丁香| 亚洲男女在线| 亚洲精品大秀视频| 久久久国产精品无码专区| 青草娱乐极品免费视频| 国产成人精品一区二区三在线观看| 成人精品午夜福利在线播放| 日韩二区三区无| 91在线日韩在线播放| 囯产av无码片毛片一级| 嫩草在线视频| 国产一级在线观看www色| 成人a免费α片在线视频网站| 狠狠色婷婷丁香综合久久韩国| 一本一道波多野结衣av黑人在线| 亚洲婷婷在线视频| 九九久久精品免费观看| 在线免费亚洲无码视频| 亚洲精品老司机| 91免费片| 日韩在线欧美在线| 亚洲伊人电影| 欧美成人午夜在线全部免费| 99精品伊人久久久大香线蕉| 亚洲日韩精品无码专区| 国产激情国语对白普通话| 97青草最新免费精品视频| 情侣午夜国产在线一区无码| 3D动漫精品啪啪一区二区下载| 国产人妖视频一区在线观看| 国产精品福利尤物youwu| 色天天综合| 色综合久久综合网| 免费又爽又刺激高潮网址| 又爽又大又光又色的午夜视频| 欧美成人亚洲综合精品欧美激情| 青青草国产免费国产| 国产精品欧美在线观看| 久久久久久久蜜桃| 91原创视频在线| 伊人久久久大香线蕉综合直播| 美女无遮挡免费网站| 自慰网址在线观看| 午夜综合网| 国产成人AV综合久久| 亚洲激情区| 男人天堂伊人网| 亚洲国产欧美中日韩成人综合视频| 免费网站成人亚洲| 亚洲最新在线| 国产99在线观看| 第一区免费在线观看| 亚洲成人精品久久| 欧美日本一区二区三区免费| 精品福利国产| 国产精品无码AV中文| 亚洲高清无码精品| 久久一本精品久久久ー99| 手机在线看片不卡中文字幕| 国产福利微拍精品一区二区| 五月激情婷婷综合| 99热国产这里只有精品9九| 国模粉嫩小泬视频在线观看|