張 逸,楊洪耕
(1.福建省電力有限公司電力科學研究院,福建 福州 350007;2.四川大學 電氣信息學院,四川 成都 610065)
隨著電能質量監(jiān)測系統(tǒng)規(guī)模的不斷擴大,缺乏標準統(tǒng)一的電能質量數(shù)據(jù)存儲體系所造成的監(jiān)測數(shù)據(jù)管理困難問題越發(fā)嚴重。IEEE 1159.3標準中提出的電能質量數(shù)據(jù)交換格式PQDIF(Power Quality Data Interchange Format)[1]完全獨立于監(jiān)測設備的軟硬件,不僅能較好地解決多數(shù)據(jù)源數(shù)據(jù)兼容問題,還可以實現(xiàn)電能質量物理屬性的多角度觀察功能,符合電能質量監(jiān)測技術的發(fā)展需要[2-3],因此被普遍作為電能質量監(jiān)測系統(tǒng)中監(jiān)測數(shù)據(jù)交換的標準格式[3-4]。
目前電能質量監(jiān)測系統(tǒng)普遍采用2層式架構[5-7]。在此架構下,監(jiān)測主站按周期采用FTP等協(xié)議直接召喚各監(jiān)測裝置生成的PQDIF文件[8],并完成隨后的文件解析、數(shù)據(jù)分析、儲存和發(fā)布等工作。與設置區(qū)域子站的3層結構相比,2層式架構結構簡單,便于管理,且減少了1層設備的建設投資和維護費用,經(jīng)濟性更好,但也存在監(jiān)測主站負擔重的問題。隨著電能質量監(jiān)測系統(tǒng)建設工作的推進,監(jiān)測點的數(shù)量持續(xù)增加,某些地區(qū)的監(jiān)測系統(tǒng)已包含數(shù)千個監(jiān)測點[5-6]。監(jiān)測裝置周期性地為每個監(jiān)測點生成一個PQDIF文件,這就意味著監(jiān)測主站需要同時解析數(shù)千個PQDIF文件。這種數(shù)據(jù)文件海量化的趨勢已經(jīng)給傳統(tǒng)的基于串行編程方式設計的解析程序帶來了很大困難,其中最顯著的問題是解析時間過長、大量資源被占用從而導致監(jiān)測主站長時間無法正常響應用戶請求,甚至造成主站系統(tǒng)崩潰。目前國內(nèi)外文獻中尚無對上述問題的研究,因此迫切需要一種針對海量PQDIF文件的快速解析方案。
隨著計算機硬件技術的發(fā)展,傳統(tǒng)的面向單核的串行編程技術已逐漸被基于多核多線程模式的并行編程技術所取代[9]。作為實現(xiàn)高速計算的一種重要途徑,并行編程技術為以上問題提供了一種全新的解決方案。
基于上述情況,本文提出了一種針對海量PQDIF文件的快速解析方案。針對傳統(tǒng)方案中需要重復解析相同數(shù)據(jù)源的情況,提出了3種可行方法以快速判斷通道序列定義是否改變,僅解析改變了的數(shù)據(jù)源記錄;采用并行編程和緩存池技術,實現(xiàn)了利用多線程的海量觀測值記錄并行解析。通過分析在不同CPU核數(shù)、不同PQDIF文件數(shù)量情況下的解析耗時證明了此方案的實用性。目前,本文方案已在四川電能質量一體化數(shù)據(jù)平臺中成功應用。
PQDIF文件結構分為物理層和邏輯層。物理層結構定義了基本和復雜的數(shù)據(jù)類型在文件中的構造形式,邏輯層結構定義了電能質量數(shù)據(jù)用物理層數(shù)據(jù)的詮釋方式。
從物理結構上看,PQDIF文件由一系列的記錄所組成,每個記錄均包含記錄頭和記錄體。記錄頭中包括記錄類型、大小以及指向下一個記錄的鏈接。記錄體由集合、標量和向量這3種類型元素組成:集合可包含標量、向量,還可以包含集合;標量指特定物理類型的單值;向量為任意大小的數(shù)列[1]。
PQDIF文件中,數(shù)據(jù)源記錄和觀測值記錄是最重要的2種記錄,兩者相互關聯(lián),前者為后者提供測量值所對應的電能質量指標類型、單位以及相位等信息,后者根據(jù)前者中對應的定義保存實際測量值。在電能質量監(jiān)測系統(tǒng)中,監(jiān)測裝置投入實際運行后,主站一般也僅解析其上傳的PQDIF文件中的數(shù)據(jù)源記錄和觀測值記錄。
傳統(tǒng)PQDIF文件解析方案一般直接調用Electrotek Concepts公司開發(fā)的PQDIF COM(Component Object Model,組件對象模型),將目前版本pqdcom4.dll注冊并導入后,即可利用已有的應用程序編程接口函數(shù)解析文件,解析單個PQDIF文件的流程圖如圖1所示。
圖1 利用PQDIF COM解析單個PQDIF文件流程圖Fig.1 Flowchart of single PQDIF file parsing by PQDIF COM
傳統(tǒng)的利用PQDIF COM的解析方案(下文中簡稱傳統(tǒng)方案)的優(yōu)點是實現(xiàn)簡單,缺點包括執(zhí)行速度較慢、編碼不靈活、僅支持Windows 32位操作系統(tǒng)、處理大文件時內(nèi)存占用大等[3,10]。最關鍵的是,PQDIF COM自身未提供針對解析多個PQDIF文件的優(yōu)化方法,只能循環(huán)重復單個文件的解析過程,逐一解析每個文件。
目前,四川電能質量一體化數(shù)據(jù)平臺(下文中簡稱平臺)中已包含343個監(jiān)測點,監(jiān)測裝置每天為每個監(jiān)測點生成1個文件,文件中包括暫態(tài)事件數(shù)據(jù)和1 d內(nèi)按1 min時間間隔保存的統(tǒng)計數(shù)據(jù)(最大值、最小值、平均值、概率95值,諧波統(tǒng)計到50次),每個文件平均大小約為3 MB。
考慮到某些監(jiān)測系統(tǒng)已包含數(shù)千個監(jiān)測點,筆者利用傳統(tǒng)方案測試解析1500個PQDIF文件,所有文件均來自平臺中所有監(jiān)測點不同天的實際監(jiān)測數(shù)據(jù)。測試服務器硬件條件為4核2.50 GHz Xeon E5420,內(nèi)存4 GB。由于服務器負載變化,導致每次解析耗時有所不同,因此采用K次最優(yōu)測量方法[11]得到解析時間(第4節(jié)中也采用同樣的測量方法),測試結果如圖2所示。由于數(shù)據(jù)庫存儲時間與所選用的數(shù)據(jù)庫引擎、數(shù)據(jù)庫設計以及存儲策略有關,故未計入總耗時中。
圖2 傳統(tǒng)方案解析耗時Fig.2 Time consumption of traditional parsing schemes
由測試結果可知,傳統(tǒng)方案耗時大約為0.5 h(1 750301 ms),實際情況中需考慮存儲數(shù)據(jù)庫的時間,耗時將更長。這將導致監(jiān)測主站長時間無法響應用戶請求,而且測試過程中也有系統(tǒng)崩潰的情況出現(xiàn),因此,傳統(tǒng)方案已經(jīng)無法適應目前電能質量監(jiān)測系統(tǒng)中解析海量PQDIF文件的需求。
針對傳統(tǒng)方案的缺點,本文方案沒有使用PQDIF COM,而是利用標準中提供的C語言頭文件[1],采用直接編碼的方式,自行編寫解析方法。其優(yōu)勢包括內(nèi)存使用效率高、執(zhí)行速度快、平臺通用性強、可方便地進入方法內(nèi)部調試、便于軟件的升級與維護等,更重要的是此方案編程靈活[3],便于程序的優(yōu)化設計。以下就分別從兩方面針對海量PQDIF文件解析進行優(yōu)化。
在解析PQDIF文件中各序列實例的數(shù)據(jù)時,需要先獲得其在數(shù)據(jù)源記錄中對應的標簽值組合,從而得到此數(shù)據(jù)對應的電能質量指標類型(如圖1所示)。在實際已建成的電能質量監(jiān)測系統(tǒng)中,一般通過監(jiān)測裝置接入規(guī)范規(guī)定了裝置需采集的指標類型,故數(shù)據(jù)源記錄相對固定,而且裝置投入正常運行后,每天生成文件中數(shù)據(jù)源記錄的通道序列定義也應完全相同,因此,預先構造通道序列定義表(以下簡稱定義表)保存已知的定義。在解析程序初始化時,將定義表讀入內(nèi)存,隨后對裝置上傳文件中通道序列定義是否改變進行快速判斷,如果未改變,則直接利用內(nèi)存中的定義表得到序列實例對應的指標類型,僅在有變化的情況下才重新解析數(shù)據(jù)源記錄,更新定義表,從而避免重復解析相同的數(shù)據(jù)源記錄,減少了解析耗時。
新型監(jiān)測裝置接入時,預先解析數(shù)據(jù)源記錄,得到每個序列定義的6種標簽組合(如圖1中所示),并唯一地確定序列定義的指標類型,保存在定義表中??紤]到不同類型裝置的通道序列定義可能不同,故需在表中保存裝置類型標識,也可通過在監(jiān)測裝置接入規(guī)范中強制規(guī)定數(shù)據(jù)源記錄形式來解決,但此方法通用性稍差。定義表如表1所示。
表1 通道序列定義表Tab.1 List of channel series definition
PQDIF文件中每個記錄的記錄頭中均保存有1個校驗和(32 bit的循環(huán)冗余碼校驗)來保證物理結構的正確性和完整性[1],2個完全相同的記錄體的校驗和相同,故可利用校驗和來快速判斷數(shù)據(jù)源記錄是否變化,但存在個別裝置在除通道序列定義外的其他信息中利用tagEffective標簽值表示數(shù)據(jù)源生效時間或在tagNameDS標簽中保存監(jiān)測點名稱等情況,將造成數(shù)據(jù)源記錄校驗和變化。此時,可通過計算tagChannelDefns及隨后的集合數(shù)據(jù)塊的校驗和來判斷通道序列定義是否有改變。此時應注意,如果是tagNameDS這類向量的數(shù)列大小發(fā)生變化(如監(jiān)測點名稱長度變化),將會導致其后集合在記錄體中的相對地址發(fā)生偏移(即link.linkElement值改變),故此時需減去偏移量后再計算校驗和。
因此,針對如何快速判斷通道序列定義是否發(fā)生變化,有以下3種可行的方法。
a.在監(jiān)測系統(tǒng)裝置接入規(guī)范中規(guī)定只有當數(shù)據(jù)源記錄需要改變時,裝置才在上傳的文件中包含數(shù)據(jù)源記錄。
b.規(guī)范各裝置上傳的數(shù)據(jù)源記錄的內(nèi)容(不包含隨時間或監(jiān)測點變化的信息),通過比較記錄頭中的校驗和快速判斷數(shù)據(jù)源記錄是否改變。
c.無需對監(jiān)測裝置進行規(guī)范,對數(shù)據(jù)源記錄進行初步解析得到tagChannelDefns及其后的集合數(shù)據(jù)塊,將其中LinkElement值減去偏移量后計算數(shù)據(jù)塊校驗和,比較判斷其中定義是否發(fā)生變化。
3種方法解析耗時和實現(xiàn)復雜程度依次增加,但通用性也隨之提高,可根據(jù)監(jiān)測系統(tǒng)實施的實際情況進行選擇,本方案采用方法c。
目前,1個PQDIF文件中通常包含數(shù)個觀測值記錄,考慮到時間序列的差異,一般分為除閃變外的穩(wěn)態(tài)統(tǒng)計數(shù)據(jù)(諧波、電壓偏差、三相不平衡等)、閃變相關數(shù)據(jù)(電壓波動、短時閃變和長時閃變)以及暫態(tài)事件數(shù)據(jù)(電壓暫降、短時中斷等)3類記錄,以便共用時間序列,節(jié)約存儲空間。由于各觀測值記錄序列實例之間沒有數(shù)據(jù)依賴關系,因此可獨立并行解析。并行模式中,并行數(shù)據(jù)的粒度選擇非常重要,其與領域的數(shù)據(jù)特征和算法的數(shù)據(jù)依賴關系密切,同時要權衡普適性和實現(xiàn)難度[12]。方案設計初期曾考慮參考文獻[13]中并行解析電力系統(tǒng)暫態(tài)數(shù)據(jù)交換通用格式(COMTRADE)文件的數(shù)據(jù)分塊方法,將所有觀測值記錄平均分成固定大小的數(shù)據(jù)塊交由各線程獨立解析,并部署專門的線程對塊邊緣進行合并解析,此方法并行粒度高,且各線程負載較均衡。但測試后發(fā)現(xiàn),由于PQDIF結構較COMTRADE復雜很多,數(shù)據(jù)塊邊緣合并困難,不但易出錯,而且耗時較長,甚至出現(xiàn)解析線程等待邊緣合并完成的情況,造成了額外的同步等待耗時,而且,專門設置邊緣解析線程也較浪費系統(tǒng)資源。因此,本方案直接選擇觀測值記錄整體作為并行數(shù)據(jù)粒度,雖然對于少量文件,并行程度較低,但針對海量文件,各線程之間負載的細微差異基本可以忽略,而且程序實現(xiàn)簡單,不易出錯。由于時間序列解析在觀測值記錄內(nèi)部解析過程中進行,因此,不同類型數(shù)據(jù)的采集時間間隔差異并不影響解析效率。并行解析原理圖見圖3。
圖3 多線程并行解析觀測值記錄原理圖Fig.3 Schematic diagram of multi-threading parallel parsing of observation records
本文方案專門部署一個PQDIF文件讀取線程FRT(File Reading Thread),其與觀測值記錄解析線程 OPT(Observation Parsing Thread)形成流水線并行,并使用任務池協(xié)調其速度差異,由于讀取文件,解析數(shù)據(jù)源記錄,并分解出各觀測值記錄的耗時僅為解析觀測值記錄耗時的8%左右,因此,此優(yōu)化機制能為OPT提供持續(xù)不斷的數(shù)據(jù)。
FRT分解得到各觀測值記錄后,填入任務池中,隨后繼續(xù)讀取下一個文件。這里有2種方法可供選擇:第1種是FRT將各觀測值記錄的所屬文件地址和記錄絕對地址索引(前一記錄頭中的linkNextRecord值)填入任務池中,各OPT根據(jù)地址和索引讀取記錄;第2種是FRT直接將分解出的未解壓的觀測值記錄數(shù)據(jù)塊填入任務池中。測試后發(fā)現(xiàn),第1種方法雖然減少了任務池的內(nèi)存占用,但各線程并行讀取文件,將導致訪問文件的位置有很強的隨機性,無法利用文件系統(tǒng)的預取優(yōu)化,降低了磁盤的訪問效率;第2種方法中每個觀測值記錄解壓前的大小僅為100 KB左右,并不會大量占用內(nèi)存。綜合考慮,本文采用第2種方法。
OPT循環(huán)訪問任務池,取走待解析的觀測值記錄,解壓后獨立并行解析。為了減少有限存儲帶寬的競爭,將載入內(nèi)存的定義表拷貝到各線程局部變量中。OPT完成解析觀測值記錄后并不直接將結果存入數(shù)據(jù)庫中,而是將其放入數(shù)據(jù)緩存池中,待緩存數(shù)據(jù)達到一定容量后,由專門的數(shù)據(jù)存儲線程DST(Data Saving Thread)一次性批量插入數(shù)據(jù)庫中,這樣不但避免了多個OPT頻繁操作數(shù)據(jù)庫造成的堵塞,還能夠更好地發(fā)揮批量索引的插入優(yōu)勢。
根據(jù)四川電能質量一體化數(shù)據(jù)平臺采用Windows Server 2008操作系統(tǒng)的實際情況,本文方案基于微軟最新的.Net Framework4.0(以下簡稱“.NET 4.0”)編程模型,選擇Visual Studio 2010作為編程開發(fā)工具,它們提供了新的運行時、新的并行擴展類以及新的診斷工具,增強了對并行編程的支持,簡化了并行開發(fā)[14]。解決方案采用微軟推薦最適合.NET環(huán)境的C#語言作為并行解析項目的開發(fā)語言,為了利用標準中提供的C頭文件[1],利用C++/CLI編寫底層PQDIF文件解析函數(shù),將其作為類庫項目包含在整體解決方案中,以便與C#項目同時調試,并引用其中定義的各PQDIF邏輯結構。單個通道定義結構體聲明代碼如下:
預先構造的定義表可利用數(shù)據(jù)庫或XML文檔存儲。解析程序初始化時,將其載入內(nèi)存中并轉化為哈希表結構,可利用Hashtable類實現(xiàn)。利用裝置類型ID、通道序號以及序列索引組合出唯一的Key值,隨后可通過Key值快速檢索對應的指標類型。
第2.2節(jié)提到的3種方法中,前2種方法的實現(xiàn)較為簡單,主要功能C++/CLI代碼如下:
方案c實現(xiàn)較復雜,具體流程圖如圖4所示,在裝置初次接入時需要用同樣方法計算并保存校驗和以及tagChannelDefns集合中的linkElement值。
圖4 方案c實現(xiàn)流程圖Fig.4 Implementation flowchart of method c
在.NET 4.0中的并行編程是依賴任務并行庫TPL(Task Parallel Library)實現(xiàn)的,其最基本的執(zhí)行單元是任務,代表了一個可以被計算機并行執(zhí)行的異步操作[14]。TPL負責創(chuàng)建并管理線程來執(zhí)行任務,以下C#代碼創(chuàng)建并運行一個觀測值記錄解析任務:
為了確保每個線程都能夠正確地訪問共享存儲區(qū)(任務池和數(shù)據(jù)緩存池)內(nèi)的數(shù)據(jù),傳統(tǒng)方法需要在程序中采用封鎖機制[15],不但編程復雜,而且增加了出錯風險,降低了程序效率。本方案采用.Net 4.0新增的System.Collections.Concurrent命名空間中提供的線程安全集合類構造共享存儲區(qū),可以方便地并發(fā)訪問其中的數(shù)據(jù)[16]。利用線程安全的先進先出隊列類ConcurrentQueue實現(xiàn)任務池的主要C#代碼如下:
方案中還利用ManualResetEventSlim類協(xié)調OPT與FRT,以免寫入的觀測值記錄超過任務池預設大?。焕肨ask類的WaitAll()方法保證所有OPT均完成后結束解析;利用AggregateException類處理并行解析過程中的異常;使用SqlBulkCopy類實現(xiàn)大批量數(shù)據(jù)快速導入數(shù)據(jù)庫等,篇幅所限,在此就不全部展開詳述。
筆者將本文所提方案在四川電能質量一體化數(shù)據(jù)平臺中應用實施,并用現(xiàn)場PQDIF文件對方案實用性和可靠性進行驗證。測試平臺如表2所示。
表2 測試平臺軟硬件條件Tab.2 Software and hardware conditions of test platform
在與第1.2節(jié)中相同的測試條件下(4核服務器),本文方案與傳統(tǒng)方案解析耗時對比如圖5所示。
由圖5可見,本文方案相對傳統(tǒng)方案解析耗時明顯減少,并可隨著PQDIF文件數(shù)量的增加獲得更高的加速比,解析1500個文件的耗時可控制在5 min以內(nèi)(282306 ms)。
圖5 快速解析方案與傳統(tǒng)方案解析耗時對比Fig.5 Comparison of parsing time consumption between proposed scheme and traditional scheme
由測試結果可知,由于本文方案直接選擇觀測值記錄整體作為并行解析的數(shù)據(jù)粒度,因此可顯著提高存儲在觀測值記錄中的每種類型數(shù)據(jù)(包括穩(wěn)態(tài)數(shù)據(jù)和暫態(tài)數(shù)據(jù))的解析效率。各類型數(shù)據(jù)的解析耗時對比如表3所示。
表3 各類型電能質量監(jiān)測數(shù)據(jù)解析耗時對比Tab.3 Comparison of parsing time consumption for different types of power quality monitoring data
表3中,某類型數(shù)據(jù)的解析耗時為1500個文件中此類數(shù)據(jù)解析耗時的總和,且解析耗時為觀測值記錄中各類型數(shù)據(jù)的解析時間,不包括數(shù)據(jù)源記錄的解析耗時,均采用K次最優(yōu)測量方法得出;諧波類數(shù)據(jù)包括2~50次諧波電壓幅值(相角)、諧波電流幅值(相角)、諧波有功(無功)功率以及諧波電壓(電流)總畸變率;間諧波類數(shù)據(jù)包括前25個間諧波組電壓(電流)幅值;三相不平衡類數(shù)據(jù)包括正序(負序、零序)電壓(電流)值、電壓(電流)負序不平衡度;電壓波動與閃變類數(shù)據(jù)包括:電壓波動值、短(長)時閃變值。暫態(tài)類數(shù)據(jù)包括電壓暫降(升)事件有效值記錄、電壓暫降(升)事件波形采樣值記錄、短時中斷事件有效值(波形采樣值)記錄。
測試解析少量PQDIF文件時,本文方案也可提高解析效率,但由于本文方案選取的并行粒度較大,少量文件的并行程度較低,影響了解析效率的提高。隨文件增多,解析效率的提高將更為顯著。少量文件的解析耗時對比如表4所示。
本文方案在不同核數(shù)服務器條件下的解析耗時對比如圖6所示。由圖6可見,隨著服務器CPU核數(shù)的增加,本文方案性能提升顯著。解析1500個文件時,采用8核服務器的耗時(150 966 ms)相對4核服務器減少了約46.52%,因此,本文方案具有一定的可擴展能力。
目前,基于本文方案的解析程序已在平臺中長期穩(wěn)定運行。程序每日凌晨自啟動并解析主站采集的343個PQDIF文件,耗時約40 s,可滿足實際需要,且運行過程中未發(fā)生服務器操作系統(tǒng)崩潰、內(nèi)存溢出等錯誤,證明了本文方案的可靠性。
表4 解析少量PQDIF文件耗時對比Tab.4 Comparison of parsing time consumption between proposed scheme and traditional scheme for different PQDIF file quantities
圖6 不同CPU核數(shù)服務器條件下快速解析方案解析耗時對比測試結果Fig.6 Comparison of parsing time consumption among different CPU core quantities
本文提出一種海量PQDIF文件的快速解析方案,相對于傳統(tǒng)方案有以下幾點優(yōu)勢:解析效率高,速度快;硬件可擴展性強;程序穩(wěn)定性高;軟件可維護性強。
目前此方案已有效應用于四川電能質量一體化數(shù)據(jù)平臺。實踐證明,此方案具有較高的實用性和可靠性。但值得注意的是,解析后數(shù)據(jù)存入數(shù)據(jù)庫的耗時也是相當可觀的,因此,下一步將研究海量電能質量數(shù)據(jù)的存儲策略。