專利名稱:一種數(shù)據(jù)解析方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)處理技術(shù)領(lǐng)域,具體涉及一種數(shù)據(jù)解析方法和裝置。
背景技術(shù):
隨著微電子技術(shù)的快速發(fā)展,電力系統(tǒng)暫態(tài)錄波明顯向著高采樣率、連續(xù)穩(wěn)態(tài)記錄和海量存儲的趨勢發(fā)展。在這種錄波數(shù)據(jù)的海量化趨勢下,傳統(tǒng)的各種基于串行方式的解析方法面臨了很大的計算壓力,在對此方法的研究和實踐過程中,本發(fā)明的發(fā)明人發(fā)現(xiàn),其中突出的矛盾可以概括為以下兩點:第一,海量的comtrade數(shù)據(jù)通過串行方式加載,會花費很長時間,導(dǎo)致軟件系統(tǒng)效率低下;第二,因海量comtrade波形繪制效率低下,而導(dǎo)致全圖形高級分析軟件系統(tǒng)反應(yīng)遲鈍。
發(fā)明內(nèi)容
本發(fā)明實施例提供一種數(shù)據(jù)解析方法和裝置,以期提高海量數(shù)據(jù)的解析效率,從而提高相應(yīng)軟件系統(tǒng)的運行效率及波形繪制效率。第一方面,本發(fā)明實施例提供一種數(shù)據(jù)解析的方法,包括:讀取配置文件,從所述配置文件中獲得每個采樣點的模擬量通道數(shù)A_Count和狀態(tài)量通道數(shù)D_count ;根據(jù)預(yù)設(shè)的數(shù)據(jù)塊大小block_size將數(shù)據(jù)文件中的數(shù)據(jù)劃分為N個數(shù)據(jù)塊,其中N為正整數(shù);創(chuàng)建大小為block_size的動態(tài)緩沖區(qū)buf ;創(chuàng)建由N個共享解析結(jié)構(gòu)BLOCK組成的BLOCK隊列,并且每個BLOCK的大小都為block—size ;依次從所述數(shù)據(jù)文件中讀取一個數(shù)據(jù)塊存入所述buf中;查詢所述BLOCK隊列中是否有BLOCK為空,若是,則將所述buf中的數(shù)據(jù)塊存入為空的BLOCK中,若否,則循環(huán)等待;向所述BLOCK隊列請求數(shù)據(jù)塊,并根據(jù)所獲得的數(shù)據(jù)塊中每個采樣點的A_count和D_Count對獲得的數(shù)據(jù)塊進(jìn)行解析。進(jìn)一步的,所述數(shù)據(jù)文件為電力系統(tǒng)暫態(tài)數(shù)據(jù)交換通用格式的數(shù)據(jù)文件。在第一種可能的實施方式中,結(jié)合第一方面,所述方法還包括:通過讀取配置文件獲得所述數(shù)據(jù)文件的采樣點總數(shù)Sam_COunt和所述數(shù)據(jù)文件的文件類型;根據(jù)所述采樣點總數(shù)Sam_COunt、每個采樣點的模擬量通道數(shù)A_Count和狀態(tài)量通道數(shù)D_count,以及所述文件類型設(shè)置數(shù)據(jù)塊大小block_Size和數(shù)據(jù)塊個數(shù)N。在第二種可能的實施方式中,結(jié)合第一方面或者第一方面的第一種可能的實施方式,所述向所述BLOCK隊列請求數(shù)據(jù)塊,并根據(jù)所獲得的數(shù)據(jù)塊中每個采樣點的A_count和D.count對獲得的數(shù)據(jù)塊進(jìn)行解析包括:向所述BLOCK隊列請求數(shù)據(jù)塊,若沒有獲得數(shù)據(jù)塊,則循環(huán)等待,若獲得數(shù)據(jù)塊,則設(shè)置當(dāng)前BLOCK的占用標(biāo)志位為1,表明當(dāng)前BLOCK正在被解析;將獲得的數(shù)據(jù)塊按照所述數(shù)據(jù)塊中每個采樣點的序號index、采樣時間time、模擬量通道數(shù)A_Count和狀態(tài)量通道數(shù)D_count進(jìn)行解析,待解析完畢,將當(dāng)前BLOCK的占用標(biāo)志位設(shè)置為0,表明當(dāng)前BLOCK解析完畢。進(jìn)一步的,所述將所述buf中的數(shù)據(jù)塊存入為空的BLOCK中,與向所述BLOCK隊列請求數(shù)據(jù)塊同時進(jìn)行。在第三種可能的實施方式中,結(jié)合第一方面的第二種可能的實施方式,若所述數(shù)據(jù)文件為ASCII文件,則所述將buf中的數(shù)據(jù)塊存入為空的BLOCK中包括:從所述buf中數(shù)據(jù)塊的末尾向前搜尋換行符,若搜尋到,則停止搜尋,將搜尋的數(shù)據(jù)個數(shù)作為下邊緣數(shù)據(jù)長度E_size ;將所述數(shù)據(jù)塊的末尾E_size個數(shù)據(jù)剪掉后存入為空的BLOCK中,并將剪掉的E_size個數(shù)據(jù)存入buf中下一個數(shù)據(jù)塊的前面。進(jìn)一步的,所述向所述BLOCK隊列請求數(shù)據(jù)塊,并根據(jù)所獲得的數(shù)據(jù)塊中每個采樣點的A_count和D_count對獲得的數(shù)據(jù)塊進(jìn)行解析包括:向所述BLOCK隊列請求數(shù)據(jù)塊,并將獲得的數(shù)據(jù)塊保存至預(yù)設(shè)的解析結(jié)構(gòu)blockl中;以換行符為分隔,依次從所述blockl中的數(shù)據(jù)塊中讀取一行數(shù)據(jù)L ;在所述L中,以逗號為分隔,依次截取一個數(shù)據(jù)作為當(dāng)前采樣點的序號index,一個數(shù)據(jù)作為當(dāng)前采樣點的采樣時間time,A_count個數(shù)據(jù)分別作為當(dāng)前采樣點的各個模擬量通道的值A(chǔ)_VAL,D_count個數(shù)據(jù)分別作為當(dāng)前采樣點的各個狀態(tài)量通道的值D_VAL ;將每行數(shù)據(jù)L的index、time、A_VAL和D_VAL按照index的順序保存至預(yù)設(shè)的存儲結(jié)構(gòu)中;根據(jù)所述預(yù)設(shè)的存儲結(jié)構(gòu)進(jìn)行數(shù)據(jù)解析。在第四種可能的實施方式中,結(jié)合第一方面的第二種可能的實施方式,若所述數(shù)據(jù)文件為BINARY文件,則所述向所述BLOCK隊列請求數(shù)據(jù)塊,并根據(jù)所獲得的數(shù)據(jù)塊中每個采樣點的A_count和D_count對獲得的數(shù)據(jù)塊進(jìn)行解析包括:向所述BLOCK隊列請求數(shù)據(jù)塊,并將獲得的數(shù)據(jù)塊保存至解析結(jié)構(gòu)blockl中;從所述blockl中的數(shù)據(jù)塊中依次讀取4個字節(jié)作為當(dāng)前采樣點的序號index,4個字節(jié)作為當(dāng)前采樣點的采樣時間time,2*A_COunt個字節(jié)分別作為當(dāng)前采樣點的各個模擬量通道的D_count/8個字節(jié)分別作為當(dāng)前采樣點的各個狀態(tài)量通道的值0_VAL ;將所述數(shù)據(jù)塊中的index、time、A_VAL和D_VAL保存至預(yù)設(shè)的存儲結(jié)構(gòu)中;根據(jù)所述預(yù)設(shè)的存儲結(jié)構(gòu)進(jìn)行數(shù)據(jù)解析。第二方面,本發(fā)明實施例還提供一種數(shù)據(jù)解析的裝置,包括:讀取模塊,用于讀取配置文件,從所述配置文件中獲得每個采樣點的模擬量通道數(shù)A_count和狀態(tài)量通道數(shù)D_count ;劃分模塊,用于根據(jù)預(yù)設(shè)的數(shù)據(jù)塊大小block_SiZe將數(shù)據(jù)文件中的數(shù)據(jù)劃分為N個數(shù)據(jù)塊,其中N為正整數(shù);創(chuàng)建模塊,用于創(chuàng)建大小為block_SiZe的動態(tài)緩沖區(qū)buf,以及創(chuàng)建由N個共享解析結(jié)構(gòu)BLOCK組成的BLOCK隊列,并且每個BLOCK的大小都為block_size ;讀取模塊,用于依次從所述數(shù)據(jù)文件中讀取一個數(shù)據(jù)塊到所述buf中,并且查詢所述BLOCK隊列中是否有BLOCK為空,若是,則將所述buf中的數(shù)據(jù)塊存入為空的BLOCK中,若否,則循環(huán)等待;解析模塊,用于向所述BLOCK隊列請求數(shù)據(jù)塊,并根據(jù)所獲得的數(shù)據(jù)塊中每個采樣點的A_count和D_count對獲得的數(shù)據(jù)塊進(jìn)行解析。本發(fā)明實施例采用將數(shù)據(jù)文件進(jìn)行分塊得到多個數(shù)據(jù)塊,然后經(jīng)過動態(tài)緩沖區(qū)buf將數(shù)據(jù)塊存入共享解析隊列BLOCK中,從而向BLOCK隊列請求數(shù)據(jù)塊,并根據(jù)從配置文件中獲得的每個采樣點的模擬量通道數(shù)A_Count和狀態(tài)量通道數(shù)D_Count對數(shù)據(jù)塊進(jìn)行解析,大大緩解了傳統(tǒng)的串行式解析方法由于一次性解析數(shù)據(jù)所造成的加載時間過長的局面,提高了數(shù)據(jù)文件的解析效率。
圖1是本發(fā)明實施例提供的數(shù)據(jù)解析的方法流程示意圖;圖2是本發(fā)明實施例提供的數(shù)據(jù)解析方法中讀取過程流程示意圖;圖3是本發(fā)明實施例提供的ASCII文件類型的數(shù)據(jù)塊示意圖;圖4是本發(fā)明實施例提供的數(shù)據(jù)解析裝置結(jié)構(gòu)示意圖;圖5是本發(fā)明實施例提供的另一種數(shù)據(jù)解析裝置的結(jié)構(gòu)示意圖;圖6是本發(fā)明實施例提供的另一種數(shù)據(jù)解析裝置的結(jié)構(gòu)示意圖;圖7是本發(fā)明實施例提供的另一種數(shù)據(jù)解析裝置的結(jié)構(gòu)示意圖。
具體實施例方式本發(fā)明實施例提供一種數(shù)據(jù)解析方法和裝置,以期提高海量數(shù)據(jù)的解析效率,從而提高相應(yīng)軟件系統(tǒng)的運行效率及波形繪制效率。為了使本技術(shù)領(lǐng)域的人員更好地理解本發(fā)明方案,下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分的實施例,而不是全部的實施例。基于本發(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都應(yīng)當(dāng)屬于本發(fā)明保護(hù)的范圍。實施例一、本發(fā)明實施例提供一種數(shù)據(jù)解析的方法,包括:讀取配置文件,從所述配置文件中獲得每個采樣點的模擬量通道數(shù)A_Count和狀態(tài)量通道數(shù)D_count ;根據(jù)預(yù)設(shè)的數(shù)據(jù)塊大小block_size將數(shù)據(jù)文件中的數(shù)據(jù)劃分為M個數(shù)據(jù)塊,其中M為正整數(shù);創(chuàng)建大小為block_size的動態(tài)緩沖區(qū)buf ;創(chuàng)建由N個共享解析結(jié)構(gòu)BLOCK組成的BLOCK隊列,并且每個BLOCK的大小都為block—size ;依次從所述數(shù)據(jù)文件中讀取一個數(shù)據(jù)塊存入所述buf中;查詢所述BLOCK隊列中是否有BLOCK為空,若是,則將所述buf中的數(shù)據(jù)塊存入為空的BLOCK中,若否,則循環(huán)等待;向所述BLOCK隊列請求數(shù)據(jù)塊,并根據(jù)所獲得的數(shù)據(jù)塊中每個采樣點的A_count和D_Count對獲得的數(shù)據(jù)塊進(jìn)行解析。本發(fā)明實施例中的數(shù)據(jù)文件可以為電力系統(tǒng)暫態(tài)數(shù)據(jù)交換通用格式(comtrade)的數(shù)據(jù)文件。進(jìn)一步的,本發(fā)明實施例提供的方法還可以包括:通過讀取配置文件獲得所述數(shù)據(jù)文件的采樣點總數(shù)Sam_Count和所述數(shù)據(jù)文件的文件類型;根據(jù)所述采樣點總數(shù)Sam_COunt、每個采樣點的模擬量通道數(shù)A_Count和狀態(tài)量通道數(shù)D_count,以及所述文件類型設(shè)置數(shù)據(jù)塊大小block_Size和數(shù)據(jù)塊個數(shù)M。所述向所述BLOCK隊列請求數(shù)據(jù)塊,并根據(jù)所獲得的數(shù)據(jù)塊中每個采樣點的A_count和D_count對獲得的數(shù)據(jù)塊進(jìn)行解析包括:向所述BLOCK隊列請求數(shù)據(jù)塊,若沒有獲得數(shù)據(jù)塊,則循環(huán)等待,若獲得數(shù)據(jù)塊,則設(shè)置當(dāng)前BLOCK的占用標(biāo)志位為1,表明當(dāng)前BLOCK正在被解析;將獲得的數(shù)據(jù)塊按照所述數(shù)據(jù)塊中每個采樣點的序號index、采樣時間time、模擬量通道數(shù)A_Count和狀態(tài)量通道數(shù)D_count進(jìn)行解析,待解析完畢,將當(dāng)前BLOCK的占用標(biāo)志位設(shè)置為0,表明當(dāng)前BLOCK解析完畢。需要說明的是,本發(fā)明實施例中為數(shù)據(jù)文件的解析建立讀取線程和解析線程,讀取線程將數(shù)據(jù)文件中的數(shù)據(jù)塊依次存入動態(tài)緩沖區(qū)buf中,并查詢BLOCK隊列中是否有元素為空,若有,則將此時buf中的數(shù)據(jù)存入該BLOCK中,并清空buf,若沒有,則循環(huán)等待,直到將數(shù)據(jù)文件中的數(shù)據(jù)塊讀取結(jié)束。解析線程不斷向BLOCK隊列請求未被解析的數(shù)據(jù),若沒有,則循環(huán)等待,若有,則將數(shù)據(jù)塊取出開始解析,并置當(dāng)前BLOCK的占用標(biāo)識位為1,表明該BLOCK正在被解析,待解析完畢,將置當(dāng)前BLOCK的占用標(biāo)志位為0,表明當(dāng)前BLOCK解析完畢,重復(fù)該步驟直到所有BLOCK全部為空,本發(fā)明實施例中通過BLOCK占用標(biāo)識位的標(biāo)識,可以有效的處理好讀取線程和解析線程對各個數(shù)據(jù)塊操作之間的同步問題。由上可見,本發(fā)明實施例提供的數(shù)據(jù)解析的方法采用將待解析的數(shù)據(jù)文件進(jìn)行分塊得到多個數(shù)據(jù)塊,然后通過動態(tài)緩沖區(qū)buf依次將數(shù)據(jù)塊存入共享解析隊列BLOCK中,并且向BLOCK隊列請求數(shù)據(jù)塊進(jìn)行解析,大大緩解了傳統(tǒng)的串行式解析方法由于一次性解析數(shù)據(jù)所造成的加載時間過長的局面,提高了數(shù)據(jù)文件的解析效率。參見圖1所示,數(shù)據(jù)解析的方法具體包括:S101、讀取配置文件,從所述配置文件中獲得每個采樣點的模擬量通道數(shù)A_Count和狀態(tài)量通道數(shù)D_count ;需要說明的是,本發(fā)明實施例中的配置文件與數(shù)據(jù)文件相對應(yīng),通過讀取配置文件還可以獲得數(shù)據(jù)文件的文件類型以及采樣點總數(shù)Sam_Count,進(jìn)一步由得到的采樣點總數(shù)Sam_Count、每個采樣點的模擬量通道數(shù)A_count和狀態(tài)量通道數(shù)D_count、以及文件類型來設(shè)置待劃分的數(shù)據(jù)塊大小block_Size和數(shù)據(jù)塊的個數(shù)N。
S102、根據(jù)預(yù)設(shè)的數(shù)據(jù)塊大小block_SiZe將數(shù)據(jù)文件中的數(shù)據(jù)劃分為M個數(shù)據(jù)塊,其中M為正整數(shù);S103、創(chuàng)建大小為block_size的動態(tài)緩沖區(qū)buf ;該動態(tài)緩沖區(qū)buf用于臨時存放數(shù)據(jù)塊;S104、創(chuàng)建由N個共享解析結(jié)構(gòu)BLOCK組成的BLOCK隊列,并且每個BLOCK的大小都為block_size,其中N為正整數(shù);即每個BLOCK中正好可以存放一個數(shù)據(jù)塊;S105、依次從數(shù)據(jù)文件中讀取一個數(shù)據(jù)塊存入動態(tài)緩沖區(qū)buf中;S106、查詢BLOCK隊列中是否有BLOCK為空,若是,則進(jìn)行步驟S107,若否,則循環(huán)等待,即每隔預(yù)設(shè)時間查詢一次BLOCK隊列中是否有BLOCK為空,例如,可以每隔IOms查詢一次BLOCK隊列;S107、將buf中的數(shù)據(jù)塊存入當(dāng)前為空的BLOCK中;將buf中的數(shù)據(jù)塊存入當(dāng)前為空的BLOCK中后,將buf清空,繼續(xù)進(jìn)行數(shù)據(jù)文件中下一個數(shù)據(jù)塊的讀?。籗108、向BLOCK隊列請求數(shù)據(jù)塊,并根據(jù)獲得的數(shù)據(jù)塊中每個采樣點的A_count和
D.count對獲得的數(shù)據(jù)塊進(jìn)行解析;可以不斷向BLOCK隊列請求未被解析的數(shù)據(jù)塊,若沒有,則循環(huán)等待,若有,則將數(shù)據(jù)取出開始解析,可以進(jìn)一步設(shè)置當(dāng)前的BLOCK占用標(biāo)識位為1,表明該BLOCK正在被解析;將獲得的數(shù)據(jù)塊按照所述數(shù)據(jù)塊中每個采樣點的序號index、采樣時間time、模擬量通道數(shù)A_Count和狀態(tài)量通道數(shù)D_Count進(jìn)行解析,待解析完畢,將當(dāng)前BLOCK的占用標(biāo)志位設(shè)置為0,表明當(dāng)前BLOCK解析完畢。需要說明的是,不斷向BLOCK隊列請求數(shù)據(jù)塊的過程與讀取數(shù)據(jù)文件中的數(shù)據(jù)塊到BLOCK隊列中的過程可以同時進(jìn)行,這樣可以進(jìn)一步提高數(shù)據(jù)解析的效率。進(jìn)一步的,若所述數(shù)據(jù)文件為ASCII文件,則所述將buf中的數(shù)據(jù)塊存入為空的BLOCK中包括:從所述buf中數(shù)據(jù)塊的末尾向前搜尋換行符,若搜尋到,則停止搜尋,將搜尋的數(shù)據(jù)個數(shù)作為下邊緣數(shù)據(jù)長度E_size ;將所述數(shù)據(jù)塊的末尾E_size個數(shù)據(jù)剪掉后存入為空的BLOCK中,并將剪掉的E_size個數(shù)據(jù)存入buf中下一個數(shù)據(jù)塊的前面;所述向所述BLOCK隊列請求數(shù)據(jù)塊,并根據(jù)所獲得的數(shù)據(jù)塊中每個采樣點的A_count和D_Count對獲得的數(shù)據(jù)塊進(jìn)行解析包括:向所述BLOCK隊列請求數(shù)據(jù)塊,并將獲得的數(shù)據(jù)塊保存至預(yù)設(shè)的解析結(jié)構(gòu)blockl中;以換行符為分隔,依次從所述blockl中的數(shù)據(jù)塊中讀取一行數(shù)據(jù)L ;在所述L中,以逗號為分隔,依次截取一個數(shù)據(jù)作為當(dāng)前采樣點的序號index, —個數(shù)據(jù)作為當(dāng)前采樣點的采樣時間time,A_count個數(shù)據(jù)分別作為當(dāng)前采樣點的各個模擬量通道的值A(chǔ)_VAL,D_count個數(shù)據(jù)分別作為當(dāng)前采樣點的各個狀態(tài)量通道的值D_VAL ;將每行數(shù)據(jù)L的indeX、time、A_VAL和D_VAL按照index的順序保存至預(yù)設(shè)的存儲結(jié)構(gòu)中;根據(jù)所述預(yù)設(shè)的存儲結(jié)構(gòu)進(jìn)行數(shù)據(jù)解析。進(jìn)一步的,若所述數(shù)據(jù)文件為BINARY文件,則向所述BLOCK隊列請求數(shù)據(jù)塊,并根據(jù)所獲得的數(shù)據(jù)塊中每個采樣點的A_Count和D_Count對獲得的數(shù)據(jù)塊進(jìn)行解析包括:向所述BLOCK隊列請求數(shù)據(jù)塊,并將獲得的數(shù)據(jù)塊保存至解析結(jié)構(gòu)blockl中;從所述blockl中的數(shù)據(jù)塊中依次讀取4個字節(jié)作為當(dāng)前采樣點的序號index,4個字節(jié)作為當(dāng)前采樣點的采樣時間time,2*A_COunt個字節(jié)分別作為當(dāng)前采樣點的各個模擬量通道的D_count/8個字節(jié)分別作為當(dāng)前采樣點的各個狀態(tài)量通道的值D_VAL ;將所述數(shù)據(jù)塊中的index、time、A_VAL和D_VAL保存至預(yù)設(shè)的存儲結(jié)構(gòu)中;根據(jù)所述預(yù)設(shè)的存儲結(jié)構(gòu)進(jìn)行數(shù)據(jù)解析。由上可知,本發(fā)明實施例提供的數(shù)據(jù)解析的方法采用將數(shù)據(jù)文件分為多個數(shù)據(jù)塊,依次對多個數(shù)據(jù)塊進(jìn)行解析,大大緩解了傳統(tǒng)的串行解析算法一次性解析數(shù)據(jù)所造成的加載時間過長的局面,進(jìn)一步的,讀取數(shù)據(jù)和解析數(shù)據(jù)的同時進(jìn)行也大大提高了整個數(shù)據(jù)解析過程的運行效率。實施例二、本發(fā)明實施例根據(jù)待解析的數(shù)據(jù)文件類型,提供另一種數(shù)據(jù)解析的方法,包括讀取過程和解析過程;參見圖2所示,讀取過程包括:S200、打開指定錄波,記錄相應(yīng)的配置文件和數(shù)據(jù)文件;S210、讀取配置文件中的文件信息,如模擬量通道數(shù)A_count和狀態(tài)量通道數(shù)D_count,采樣總數(shù)Sam_count,以及數(shù)據(jù)文件的文件類型;S220、若數(shù)據(jù)文件為BINARY文件,則進(jìn)行步驟S230,若數(shù)據(jù)文件為ASCII文件,則進(jìn)行步驟S240 ;S230、根據(jù)采樣點總數(shù)Sam_count、模擬量通道數(shù)A_count和狀態(tài)量通道數(shù)D_count以及文件類型來定義數(shù)據(jù)塊的大小block_size,如使得block_size能夠容納m個采樣點,m為正整數(shù);
S231、開辟大小為block_size的動態(tài)緩沖區(qū)buf,創(chuàng)建由N個共享解析結(jié)構(gòu)BLOCK組成的BLOCK隊列,N為正整數(shù),每個BLOCK的大小都為block_size,BLOCK結(jié)構(gòu)可以定義
如下:
權(quán)利要求
1.一種數(shù)據(jù)解析的方法,其特征在于,包括: 讀取配置文件,從所述配置文件中獲得每個采樣點的模擬量通道數(shù)A_count和狀態(tài)量通道數(shù)D_count ; 根據(jù)預(yù)設(shè)的數(shù)據(jù)塊大小block_size將數(shù)據(jù)文件中的數(shù)據(jù)劃分為M個數(shù)據(jù)塊,其中M為正整數(shù); 創(chuàng)建大小為block_size的動態(tài)緩沖區(qū)buf ; 創(chuàng)建由N個共享解析結(jié)構(gòu)BLOCK組成的BLOCK隊列,并且每個BLOCK的大小都為block_size,N為正整數(shù); 依次從所述數(shù)據(jù)文件中讀取一個數(shù)據(jù)塊存入所述buf中; 查詢所述BLOCK隊列中是否有BLOCK為空,若是,則將所述buf中的數(shù)據(jù)塊存入為空的BLOCK中,若否,則循環(huán)等待; 向所述BLOCK隊列請求數(shù)據(jù)塊,并根據(jù)所獲得的數(shù)據(jù)塊中每個采樣點的A_count和D_count對獲得的數(shù)據(jù)塊進(jìn)行解析。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述數(shù)據(jù)文件為電力系統(tǒng)暫態(tài)數(shù)據(jù)交換通用格式的數(shù)據(jù)文件。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述方法還包括: 通過讀取配置文件獲得所述數(shù)據(jù)文件的采樣點總數(shù)Sam_Count和所述數(shù)據(jù)文件的文件類型; 根據(jù)所述采樣點總數(shù)Sam_Count、每個采樣點的模擬量通道數(shù)A_count和狀態(tài)量通道數(shù)D_count,以及所述文件類型設(shè)置數(shù)據(jù)塊大小block_size和數(shù)據(jù)塊個數(shù)M。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述向所述BLOCK隊列請求數(shù)據(jù)塊,并根據(jù)所獲得的數(shù)據(jù)塊中每個采樣點的A_Count和D_Count對獲得的數(shù)據(jù)塊進(jìn)行解析包括: 向所述BLOCK隊列請求數(shù)據(jù)塊,若沒有獲得數(shù)據(jù)塊,則循環(huán)等待,若獲得數(shù)據(jù)塊,則設(shè)置當(dāng)前BLOCK的占用標(biāo)志位為1,表明當(dāng)前BLOCK正在被解析;將獲得的數(shù)據(jù)塊按照所述數(shù)據(jù)塊中每個采樣點的序號index、采樣時間time、模擬量通道數(shù)A_Count和狀態(tài)量通道數(shù)0_count進(jìn)行解析,待解析完畢,將當(dāng)前BLOCK的占用標(biāo)志位設(shè)置為0,表明當(dāng)前BLOCK解析完畢。
5.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述將所述buf中的數(shù)據(jù)塊存入為空的BLOCK中,與向所述BLOCK隊列請求數(shù)據(jù)塊同時進(jìn)行。
6.根據(jù)權(quán)利要求3所述的方法,其特征在于,若所述數(shù)據(jù)文件為ASCII文件,則所述將buf中的數(shù)據(jù)塊存入為空的BLOCK中包括: 從所述buf中數(shù)據(jù)塊的末尾向前搜尋換行符,若搜尋到,則停止搜尋,將搜尋的數(shù)據(jù)個數(shù)作為下邊緣數(shù)據(jù)長度E_size ; 將所述數(shù)據(jù)塊的末尾E_size個數(shù)據(jù)剪掉后存入為空的BLOCK中,并將剪掉的E_size個數(shù)據(jù)存入buf中下一個數(shù)據(jù)塊的前面。
7.根據(jù)權(quán)利要求6所述的方法,其特征在于,所述向所述BLOCK隊列請求數(shù)據(jù)塊,并根據(jù)所獲得的數(shù)據(jù)塊中每個采樣點的A_Count和D_Count對獲得的數(shù)據(jù)塊進(jìn)行解析包括: 向所述BLOCK隊列請求數(shù)據(jù)塊,并將獲得的數(shù)據(jù)塊保存至預(yù)設(shè)的解析結(jié)構(gòu)blockl中; 以換行符為分隔, 依次從所述blockl中的數(shù)據(jù)塊中讀取一行數(shù)據(jù)L ;在所述L中,以逗號為分隔,依次截取一個數(shù)據(jù)作為當(dāng)前采樣點的序號index,一個數(shù)據(jù)作為當(dāng)前采樣點的采樣時間time,A_count個數(shù)據(jù)分別作為當(dāng)前采樣點的各個模擬量通道的值A(chǔ)_VAL,D_count個數(shù)據(jù)分別作為當(dāng)前采樣點的各個狀態(tài)量通道的值D_VAL ; 將每行數(shù)據(jù)L的index、time、A_VAL和D_VAL按照index的順序保存至預(yù)設(shè)的存儲結(jié)構(gòu)中; 根據(jù)所述預(yù)設(shè)的存儲結(jié)構(gòu)進(jìn)行數(shù)據(jù)解析。
8.根據(jù)權(quán)利要求3所述的方法,其特征在于,若所述數(shù)據(jù)文件為BINARY文件,則所述向所述BLOCK隊列請求數(shù)據(jù)塊,并根據(jù)所獲得的數(shù)據(jù)塊中每個采樣點的A_count和D_count對獲得的數(shù)據(jù)塊進(jìn)行解析包括: 向所述BLOCK隊列請求數(shù)據(jù)塊,并將獲得的數(shù)據(jù)塊保存至解析結(jié)構(gòu)blockl中; 從所述blockl中的數(shù)據(jù)塊中依次讀取4個字節(jié)數(shù)據(jù)作為當(dāng)前采樣點的序號index, 4個字節(jié)數(shù)據(jù)作為當(dāng)前采樣點的采樣時間time,2*A_count個字節(jié)數(shù)據(jù)分別作為當(dāng)前采樣點的各個模擬量通道的值A(chǔ)_VAL,D_count/8個字節(jié)數(shù)據(jù)分別作為當(dāng)前采樣點的各個狀態(tài)量通道的值D_VAL ; 將所述數(shù)據(jù)塊中的index、time、A_VAL和D_VAL保存至預(yù)設(shè)的存儲結(jié)構(gòu)中; 根據(jù)所述預(yù)設(shè)的存儲結(jié)構(gòu)進(jìn)行數(shù)據(jù)解析。
9.一種數(shù)據(jù)解析的裝置,其特征在于,包括: 獲取模塊,用于讀取配置文件,從所述配置文件中獲得每個采樣點的模擬量通道數(shù)A_count和狀態(tài)量通道數(shù)D_count ; 劃分模塊,用于根據(jù)預(yù)設(shè)的數(shù)據(jù)塊大小block_Size將數(shù)據(jù)文件中的數(shù)據(jù)劃分為M個數(shù)據(jù)塊,其中M為正整數(shù); 創(chuàng)建模塊,用于創(chuàng)建大小為block_Size的動態(tài)緩沖區(qū)buf,以及創(chuàng)建由N個共享解析結(jié)構(gòu)BLOCK組成的BLOCK隊列,并且每個BLOCK的大小都為block_size,其中N為正整數(shù); 讀取模塊,用于依次從所述數(shù)據(jù)文件中讀取一個數(shù)據(jù)塊到所述buf中,并且查詢所述BLOCK隊列中是否有BLOCK為空,若是,則將所述buf中的數(shù)據(jù)塊存入為空的BLOCK中,若否,則循環(huán)等待; 解析模塊,用于向所述BLOCK隊列請求數(shù)據(jù)塊,并根據(jù)所獲得的數(shù)據(jù)塊中每個采樣點的A_count和D_count對獲得的數(shù)據(jù)塊進(jìn)行解析。
10.根據(jù)權(quán)利要求9所述的裝置,其特征在于,所述獲取模塊還用于通過讀取配置文件,獲得所述數(shù)據(jù)文件的采樣點總數(shù)Sam_count和所述數(shù)據(jù)文件的文件類型; 其中,所述數(shù)據(jù)塊大小block_size和數(shù)據(jù)塊個數(shù)M根據(jù)所述采樣點總數(shù)Sam_count、每個采樣點的模擬量通道數(shù)A_count和狀態(tài)量通道數(shù)D_count,以及所述文件類型設(shè)定。
11.根據(jù)權(quán)利要求9所述的裝置,其特征在于,所述解析模塊用于向所述BLOCK隊列請求數(shù)據(jù)塊,若沒有獲得數(shù)據(jù)塊,則循環(huán)等待,若獲得數(shù)據(jù)塊,則設(shè)置當(dāng)前BLOCK的占用標(biāo)志位為1,表明當(dāng)前BLOCK正在被解析;將獲得的數(shù)據(jù)塊按照所述數(shù)據(jù)塊中每個采樣點的序號index、采樣時間time、模擬量通道數(shù)A_count和狀態(tài)量通道數(shù)0_0011111:進(jìn)行解析,待解析完畢,將當(dāng)前BLOCK結(jié)構(gòu)的占用標(biāo)志位設(shè)置為0,表明當(dāng)前BLOCK結(jié)構(gòu)解析完畢。
12.根據(jù)權(quán)利要求9所述的裝置,其特征在于,所述讀取模塊將所述buf中的數(shù)據(jù)塊存入為空的BLOCK中與所述解析模塊向所述BLOCK隊列請求數(shù)據(jù)塊同時進(jìn)行。
13.根據(jù)權(quán)利要求10所述的裝置,其特征在于,所述裝置還包括調(diào)整模塊,用于當(dāng)所述數(shù)據(jù)文件為ASCII文件時,從所述buf中的數(shù)據(jù)塊的末尾向前搜尋換行符,若搜尋到,則停止搜尋,將搜尋的數(shù)據(jù)個數(shù)作為下邊緣數(shù)據(jù)長短E_size,將所述數(shù)據(jù)塊的末尾E_size個數(shù)據(jù)剪掉后存入為空的BLOCK中,并將剪掉的E_size個數(shù)據(jù)存入buf中下一個數(shù)據(jù)塊的前面。
14.根據(jù)權(quán)利要求13所述的裝置,其特征在于,所述解析模塊包括:第一請求單元、第一截取單元、第一解析單元; 所述第一請求單元用于向所述BLOCK隊列請求數(shù)據(jù)塊,并將獲得的數(shù)據(jù)塊保存至預(yù)設(shè)的解析結(jié)構(gòu)blockl中; 所述第一截取單元用于以換行符為分隔,依次從所述blockl中的數(shù)據(jù)塊中讀取一行數(shù)據(jù)L,在所述L中,以逗號為分隔,依次截取一個數(shù)據(jù)作為當(dāng)前采樣點的序號index,一個數(shù)據(jù)作為當(dāng)前采樣點的采樣時間time,A_count個數(shù)據(jù)分別作為當(dāng)前采樣點的各個模擬量通道的值A(chǔ)_VAL,D_count個數(shù)據(jù)分別作為當(dāng)前采樣點的各個狀態(tài)量通道的值D_VAL,并且將每行數(shù)據(jù)L的index、time、A_VAL和D_VAL按照index的順序保存至預(yù)設(shè)的存儲結(jié)構(gòu)中;所述第一解析單元用于根據(jù)所述預(yù)設(shè)的存儲結(jié)構(gòu)進(jìn)行數(shù)據(jù)解析。
15.根據(jù)權(quán)利要求10所述的裝置,其特征在于,所述解析模塊包括:第二請求單元、第二截取單元、第二解析單元; 所述第二請求單元用于當(dāng)所述數(shù)據(jù)文件為BINARY文件時,向所述BLOCK隊列請求數(shù)據(jù)塊,并將獲得的數(shù)據(jù)塊保存至解析結(jié)構(gòu)blockl中; 所述第二截取單元用于從所述blockl中的數(shù)據(jù)塊中依次讀取4個字節(jié)數(shù)據(jù)作為當(dāng)前采樣點的序號index, 4個字節(jié)數(shù)據(jù)作為當(dāng)前采樣點的采樣時間time, 2*A_count個字節(jié)數(shù)據(jù)分別作為當(dāng)前采樣點的各個模擬量通道的值A(chǔ)_VAL,D_count/8個字節(jié)數(shù)據(jù)分別作為當(dāng)前采樣點的各個狀態(tài)量通道的值D_VAL,并且將所述數(shù)據(jù)塊中的index、time、A_VAL和D_VAL保存至預(yù)設(shè)的存儲結(jié)構(gòu)中; 所述第二解析單元用于根據(jù)所述預(yù)設(shè)的存儲結(jié)構(gòu)進(jìn)行數(shù)據(jù)解析。
全文摘要
本發(fā)明公開了一種數(shù)據(jù)解析的方法和裝置。本發(fā)明實施例提供的數(shù)據(jù)解析的方法采用將數(shù)據(jù)文件劃分為固定大小的多個數(shù)據(jù)塊,將數(shù)據(jù)塊通過緩沖區(qū)buf依次送入創(chuàng)建的共享解析BLOCK隊列中,從而對BLOCK隊列中的數(shù)據(jù)塊依次進(jìn)行讀取和解析,大大緩解了傳統(tǒng)的串行解析算法一次性解析數(shù)據(jù)所造成的加載時間過長的局面,提高了海量數(shù)據(jù)的解析效率,同時提高相應(yīng)軟件系統(tǒng)的運行效率及波形繪制效率。
文檔編號G06F17/30GK103164538SQ20131012525
公開日2013年6月19日 申請日期2013年4月11日 優(yōu)先權(quán)日2013年4月11日
發(fā)明者梁玉生, 董昕, 顧莉娜 申請人:深圳市華力特電氣股份有限公司