一種分布式實時測試系統(tǒng)多路測試數(shù)據(jù)壓縮與歸并方法
【專利摘要】一種分布式實時測試系統(tǒng)多路測試數(shù)據(jù)壓縮與歸并方法,有九大步驟:一、根據(jù)變量特性制定收集策略;二、查詢緩存中最新一幀數(shù)據(jù),如果ID與變量值相同,則保存時間標簽和變量ID;三、主控節(jié)點將實時仿真節(jié)點傳來數(shù)據(jù)保存各文件中;四、歸并處理信息并保存數(shù)據(jù)結(jié)構(gòu)中;五、遍歷數(shù)據(jù)文件,如果只有時間標簽和變量ID,則從前一幀數(shù)據(jù)中獲取變量值補齊本幀數(shù)據(jù);六、獲取所有文件第一幀數(shù)據(jù),并且比較得出時間標簽最小的一幀;七、比較獲得的時間標簽和前一幀是否相同,若不同,則向輸出文件寫一行數(shù)據(jù);八、將獲取的這幀數(shù)據(jù)值更新到id_value_map中,并且將變化信息更新以便下次比較;九、循環(huán)執(zhí)行步驟六—八,直至所有文件都讀取完畢,將最后一行寫入輸出文件中。
【專利說明】一種分布式實時測試系統(tǒng)多路測試數(shù)據(jù)壓縮與歸并方法
【【技術(shù)領(lǐng)域】】
[0001]本發(fā)明提供一種分布式實時測試系統(tǒng)多路測試數(shù)據(jù)壓縮與歸并方法,它涉及基于分布式架構(gòu)的實時測試系統(tǒng)的測試數(shù)據(jù)收集,屬于嵌入式軟件測試【技術(shù)領(lǐng)域】。
【【背景技術(shù)】】
[0002]隨著嵌入式系統(tǒng)在航空航天等領(lǐng)域的應(yīng)用面不斷擴大,針對嵌入式軟件的測試需求也日益迫切。一方面,為成功的完成測試任務(wù),測試系統(tǒng)必須能夠采集測試過程中產(chǎn)生的大量數(shù)據(jù),同時針對航空航天等領(lǐng)域的測試系統(tǒng)往往要求有很高的實時性,必須能夠在規(guī)定的時間點上準確無誤的完成預定的任務(wù);另一方面,隨著嵌入式系統(tǒng)本身的復雜性越來越強,對測試系統(tǒng)容納負載的能力也相應(yīng)提出越來越高的要求,采用分布式架構(gòu)的測試系統(tǒng)不僅可以將負載平均分配到各個節(jié)點互不干擾的運行,也可以提供更多的載體供不同的硬件接口板卡工作,以滿足嵌入式測試中日益增長的對于多種總線接口,多種通訊協(xié)議同時工作的要求,并且可以降低每個節(jié)點計算機的功耗,提高系統(tǒng)的可靠性。
[0003]分布式實時測試系統(tǒng)采用主控節(jié)點加實時仿真節(jié)點的結(jié)構(gòu),其中,主控節(jié)點負責實時性要求不高的任務(wù),如人機交互、控制測試過程、分析測試數(shù)據(jù)等;實時仿真節(jié)點則負責仿真與被測件通訊的組件并通過總線接口與被測件完成數(shù)據(jù)交互,為滿足高實時性測試要求,實時仿真節(jié)點必須在規(guī)定的時間點完成任務(wù)調(diào)度。
[0004]分布式實時測試系統(tǒng)測試過程中產(chǎn)生的數(shù)據(jù)有兩個突出的特點,一是活動時間性強,要求在一定的時刻和/或一定的時間內(nèi)自外部環(huán)境收集數(shù)據(jù)、按彼此聯(lián)系存取以獲得的數(shù)據(jù)和處理收集的數(shù)據(jù)、再及時作出相應(yīng);而是要處理“短暫”數(shù)據(jù),這種數(shù)據(jù)只在一定的時間范圍內(nèi)有效,過時則無意義了。這就要求分布式實時測試系統(tǒng)具有將每一時刻測試數(shù)據(jù)的變化都收集起來的能力, 這意味著需要收集的數(shù)據(jù)量十分巨大,在通過網(wǎng)絡(luò)傳輸之前對其進行壓縮處理能夠節(jié)省大量的傳輸時間。另外由于測試數(shù)據(jù)來源為多個實時仿真節(jié)點,一方面測試系統(tǒng)需要收集的數(shù)據(jù)量進一步增大,另一方面在測試結(jié)束后需要對多路測試數(shù)據(jù)進行歸并處理。
[0005]因此,需要一種方法,能夠在不占用大量系統(tǒng)資源和運算時間的情況下對測試數(shù)據(jù)進行壓縮處理,并且在網(wǎng)絡(luò)傳輸之后能夠?qū)嚎s的數(shù)據(jù)還原,不造成數(shù)據(jù)丟失;同時,這種方法還要能夠?qū)⒍鄠€實時仿真節(jié)點收集的多路測試數(shù)據(jù)歸并為一路按時序排列的測試數(shù)據(jù)。
【
【發(fā)明內(nèi)容】
】
[0006]1.目的:本發(fā)明的目的在于提供一種分布式實時測試系統(tǒng)多路測試數(shù)據(jù)壓縮與歸并方法,這種方法能夠在不占用大量系統(tǒng)資源和運算時間的情況下對測試數(shù)據(jù)進行壓縮處理,并且在網(wǎng)絡(luò)傳輸之后能夠?qū)嚎s的數(shù)據(jù)還原,不造成數(shù)據(jù)丟失;同時,這種方法還要能夠?qū)⒍鄠€實時仿真節(jié)點收集的多路測試數(shù)據(jù)歸并為一路按時序排列的測試數(shù)據(jù)。
[0007]2.技術(shù)方案:為解決上述技術(shù)問題,本發(fā)明提供了一種分布式實時測試系統(tǒng)多路測試數(shù)據(jù)壓縮與歸并方法,它包括以下步驟:
[0008]步驟一:減少測試數(shù)據(jù)的收集次數(shù);測試系統(tǒng)收集數(shù)據(jù)的方式有兩種,一種是需要按照某個時間間隔收集的數(shù)據(jù),比如按照5ms的周期采集模擬量或者每隔Ims查詢某個接口上的電平是否變?yōu)楦唠娖?;另一種方式是不需要主動地收集數(shù)據(jù),比如串口上的數(shù)據(jù)只需在板卡檢測到總線上有新數(shù)據(jù)并觸發(fā)中斷才收集數(shù)據(jù);本方法通過對這兩種數(shù)據(jù)進行區(qū)分并確立不同的收集策略,大大減少測試過程中需要傳送的測試數(shù)據(jù),這是對測試數(shù)據(jù)進行的第一層壓縮處理。
[0009]步驟二:在收集數(shù)據(jù)的過程中,每一幀測試數(shù)據(jù)包含以下信息:變量ID,收集到數(shù)據(jù)的時刻對應(yīng)的時間標簽,變量的數(shù)值。變量ID用于區(qū)分測試過程中的各個不同的變量,時間標簽用于把當前收集到的數(shù)據(jù)和歷史數(shù)據(jù)進行區(qū)分。在本方法的設(shè)計中,每一幀數(shù)據(jù)在存放到一級緩存中之前,對緩存中前一幀數(shù)據(jù)進行比對,如果變量ID與變量值都相同,則只在緩存中添加一幀時間標簽和變量ID,不需要再收集重復的變量值。由于不需要移動緩存的索引,不需要進行指針運算操作,這種比較消耗很小,然而在以很高頻率收集某個變量值的情況下可以去掉很多冗余信息。在測試完成后分析數(shù)據(jù)的時候,只要從前一幀數(shù)據(jù)中獲取變量的值即可還原所有的測試數(shù)據(jù)。
[0010]步驟三:測試過程中主控節(jié)點將實時仿真節(jié)點傳來的測試數(shù)據(jù)按照節(jié)點保存到不同的文件中。測試過程中實時仿真節(jié)點將測試數(shù)據(jù)發(fā)送到主控節(jié)點,主控節(jié)點把測試數(shù)據(jù)保存到磁盤文件中,每個實時仿真節(jié)點對應(yīng)一個文件,由于實時仿真節(jié)點發(fā)送數(shù)據(jù)的過程具有時序性故文件中的數(shù)據(jù)已經(jīng)按照時間標簽進行了排序。
[0011]測試停止后對測試數(shù)據(jù)進行還原和歸并處理,具體流程如錯誤!未找到引用源。
[0012]步驟四:對數(shù)據(jù)歸并處理進行準備;獲取數(shù)據(jù)歸并處理需要的信息并將信息保存到數(shù)據(jù)結(jié)構(gòu)中,具體包括以下幾個方面:需要進行歸并的各文件,將其索引保存到一個數(shù)據(jù)結(jié)構(gòu)中。隨著本發(fā)明中的方法應(yīng)用于不同的系統(tǒng)中,保存的文件索引和所用的數(shù)據(jù)結(jié)構(gòu)可能有所不同,可以直接保存文件路徑,也可以保存打開文件對應(yīng)的ifstream對象或者CFile對象等等;采用的數(shù)據(jù)結(jié)構(gòu)可以采用數(shù)組、鏈表、vector等等,對方法本身的實現(xiàn)并無影響;另外,本次處理的測試數(shù)據(jù)屬于哪些變量也是必須的信息,每個變量的值使用一個字符串保存下來,每個變量的ID對應(yīng)一個字符串組成一對,將其保存入map中,本map用于保存在一個時間標簽內(nèi)的所有變量的值,將其命名為id_value_map。定義一個vector用于記錄每個時間標簽內(nèi)或者說每個時刻值哪些變量發(fā)生了變化,在本發(fā)明所述方法中,歸并后的數(shù)據(jù)文件每一行記錄一個時間標簽的所有測試數(shù)據(jù),在行尾用分號分割的字符串將哪些變量有變化表示出來,例如:第一二列數(shù)據(jù)在本時刻有變化則行尾字符串為1;2,在數(shù)據(jù)處理過程中將變量是否變化的信息保存在vecModifiedCols中。
[0013]步驟五:按照順序?qū)λ袛?shù)據(jù)文件進行處理,遍歷文件中所有數(shù)據(jù),如果發(fā)現(xiàn)某一幀數(shù)據(jù)只有時間標簽和ID沒有保存變量值,則從前一幀數(shù)據(jù)中獲取變量值補齊本幀數(shù)據(jù)。
[0014]步驟六:遍歷所有的文件,獲取文件中第一幀數(shù)據(jù),由于所有文件中的數(shù)據(jù)都是各實時仿真節(jié)點按照時序關(guān)系進行收集的,所以文件的第一幀數(shù)據(jù)肯定是本文件中時間標簽最小的一幀,也就是說產(chǎn)生時間最早的一幀數(shù)據(jù)。比較各個文件的第一幀數(shù)據(jù)得到其中時間標簽最小的一幀數(shù)據(jù)。如果獲取某一文件第一幀數(shù)據(jù)失敗,則說明該文件中的數(shù)據(jù)已經(jīng)全部被獲取,從保存文件索引的數(shù)據(jù)結(jié)構(gòu)中將其刪除,下次遍歷不必再打開這個文件。[0015]步驟七:判斷所獲得的這幀數(shù)據(jù)中的時間標簽是否與記錄的上一幀數(shù)據(jù)的時間標簽相等,如果不相等,則說明這是屬于新的時間標簽的測試數(shù)據(jù),故前一個時間標簽的所有測試數(shù)據(jù)都已獲取完畢,應(yīng)該將上一時間標簽的測試數(shù)據(jù)都輸出到歸并后的輸出文件中。如果相等,則說明這一行數(shù)據(jù)還沒有拼接完成,不需要向輸出文件中寫數(shù)據(jù),繼續(xù)進行步驟八即可;這些數(shù)據(jù)在輸出文件中應(yīng)該存在于同一行。首先向文件中寫入時間標簽,然后從id_value_map中獲取變量的值,按照順序輸出到同一行,最后將vecModifiedCols拼成一個以分號分割的字符串輸出到行尾。每列中間可以空格或者制表符進行分割,該分割符只要能將各列分開即可,對本發(fā)明中的方法實現(xiàn)沒有影響。輸出一行數(shù)據(jù)后將vecModifiedCols清空以便保存下一行數(shù)據(jù)的變量變化信息。如果是第一幀數(shù)據(jù)也就是說上一幀數(shù)據(jù)的時間標簽為0則不需要向輸出文件中寫數(shù)據(jù)。
[0016]步驟八:將當前獲取的這幀測試數(shù)據(jù)的時間標簽更新到last_lable中,以便下次獲取測試數(shù)據(jù)后進行比較;同時根據(jù)這幀測試數(shù)據(jù)中的變量ID獲取變量在步驟四所述id_value_map中的位置,將所得位置信息插入到mapModifiedCoIs中并且將變量的值寫入步驟四所述id_value_map中對應(yīng)的位置。
[0017]步驟九:循環(huán)執(zhí)行步驟六到步驟八,直至所有文件都已讀取完畢,此時保存文件索引的數(shù)據(jù)結(jié)構(gòu)為空,id_Value_map中存有最后一行的數(shù)據(jù),將其寫入輸出文件中即完成多路測試數(shù)據(jù)歸并操作。
[0018]3.優(yōu)點及功效:分布式實時測試系統(tǒng)多路測試數(shù)據(jù)壓縮與歸并方法通過在收集測試數(shù)據(jù)階段根據(jù)不同變量的特點制定不同的收集策略,并且去除重復的冗余測試數(shù)據(jù),實現(xiàn)了在不占用大量系統(tǒng)資源和運算時間的情況下對測試數(shù)據(jù)的壓縮處理,并且在網(wǎng)絡(luò)傳輸之后能夠?qū)嚎s的數(shù)據(jù)還原,不造成數(shù)據(jù)丟失;同時,本發(fā)明中所述的方法能夠?qū)⒍鄠€實時仿真節(jié)點收集的多路測試數(shù)據(jù)歸并為一路按時序排列的測試數(shù)據(jù)。
【【專利附圖】
【附圖說明】】
[0019]圖1為分布式實時測試系統(tǒng)多路測試數(shù)據(jù)壓縮與歸并方法的流程示意圖
`[0020]圖2為分布式實時測試系統(tǒng)多路測試數(shù)據(jù)歸并方法的實現(xiàn)流程示意圖
【【具體實施方式】】
[0021]為使本發(fā)明要解決的技術(shù)問題、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合附圖及具體實施例進行詳細描述。
[0022]本發(fā)明的目的在于提供一種分布式實時測試系統(tǒng)多路測試數(shù)據(jù)壓縮與歸并方法,這種方法能夠在不占用大量系統(tǒng)資源和運算時間的情況下對測試數(shù)據(jù)進行壓縮處理,并且在網(wǎng)絡(luò)傳輸之后能夠?qū)嚎s的數(shù)據(jù)還原,不造成數(shù)據(jù)丟失;同時,這種方法還要能夠?qū)⒍鄠€實時仿真節(jié)點收集的多路測試數(shù)據(jù)歸并為一路按時序排列的測試數(shù)據(jù)。
[0023]為更清楚的介紹本方法在具體實施例中的應(yīng)用,首先對實施例針對的系統(tǒng)的結(jié)構(gòu)做簡單介紹:
[0024]系統(tǒng)中的節(jié)點分為主控節(jié)點和實時仿真節(jié)點兩種節(jié)點;
[0025]?主控節(jié)點負責實時性要求不高的任務(wù),如人機交互、測試用例編寫、測試數(shù)據(jù)分析等等。由主控節(jié)點向?qū)崟r仿真節(jié)點下發(fā)控制指令并且控制測試進程。[0026]?實時仿真節(jié)點負責實時性要求高的任務(wù),例如任務(wù)定時、總線接口的信息交換、測試數(shù)據(jù)的收集等等,其最小時鐘顆粒度可達25us ;
[0027]?測試過程中各實時仿真節(jié)點產(chǎn)生的數(shù)據(jù)通過網(wǎng)絡(luò)發(fā)送到主控節(jié)點進行處理。
[0028]見附圖1,本發(fā)明在具體實施例中的實施步驟如下:
[0029]步驟一:減少測試數(shù)據(jù)的收集次數(shù),測試系統(tǒng)收集數(shù)據(jù)的方式有兩種,一種是需要按照某個時間間隔收集的數(shù)據(jù),比如按照5ms的周期采集模擬量或者每隔Ims查詢某個接口上的電平是否變?yōu)楦唠娖?;另一種方式是不需要主動地收集數(shù)據(jù),比如串口上的數(shù)據(jù)只需在板卡檢測到總線上有新數(shù)據(jù)并觸發(fā)中斷才收集數(shù)據(jù);本方法通過對這兩種數(shù)據(jù)進行區(qū)分并確立不同的收集策略,大大減少測試過程中需要傳送的測試數(shù)據(jù),這是對測試數(shù)據(jù)進行的第一層壓縮處理。
[0030] 步驟二:在收集數(shù)據(jù)的過程中,每一幀測試數(shù)據(jù)包含以下信息:變量ID,收集到數(shù)據(jù)的時刻對應(yīng)的時間標簽,變量的數(shù)值。變量ID用于區(qū)分測試過程中的各個不同的變量,時間標簽用于把當前收集到的數(shù)據(jù)和歷史數(shù)據(jù)進行區(qū)分。在本方法的設(shè)計中,每一幀數(shù)據(jù)在存放到一級緩存中之前,對緩存中前一幀數(shù)據(jù)進行比對,如果變量ID與變量值都相同,則只在緩存中添加一幀時間標簽和變量ID,不需要再收集重復的變量值。由于不需要移動緩存的索引,不需要進行指針運算操作,這種比較消耗很小,然而在以很高頻率收集某個變量值的情況下可以去掉很多冗余信息。在測試完成后分析數(shù)據(jù)的時候,只要從前一幀數(shù)據(jù)中獲取變量的值即可還原所有的測試數(shù)據(jù)。
[0031]步驟三:測試過程中主控節(jié)點將實時仿真節(jié)點傳來的測試數(shù)據(jù)按照節(jié)點保存到不同的文件中。測試過程中實時仿真節(jié)點將測試數(shù)據(jù)發(fā)送到主控節(jié)點,主控節(jié)點把測試數(shù)據(jù)保存到磁盤文件中,每個實時仿真節(jié)點對應(yīng)一個文件,由于實時仿真節(jié)點發(fā)送數(shù)據(jù)的過程具有時序性故文件中的數(shù)據(jù)已經(jīng)按照時間標簽進行了排序。本發(fā)明中的方法要求主控節(jié)點必須可以判斷接收到的數(shù)據(jù)屬于哪個仿真節(jié)點,在具體的實施過程中,可以采取各種手段傳遞該信息,例如發(fā)送測試數(shù)據(jù)之前先發(fā)送測試數(shù)據(jù)的相關(guān)信息,或者在測試數(shù)據(jù)的信息幀里添加關(guān)于測試信息來源的相關(guān)屬性等等,在本實施例中采取前一種方式,實時仿真節(jié)點發(fā)送測試數(shù)據(jù)之前先通知主控節(jié)點將要發(fā)送的測試數(shù)據(jù)屬于哪個節(jié)點。
[0032]測試停止后對測試數(shù)據(jù)進行還原和歸并處理,具體流程見附圖2
[0033]步驟四:對數(shù)據(jù)歸并處理進行準備,獲取數(shù)據(jù)歸并處理需要的信息并將信息保存到數(shù)據(jù)結(jié)構(gòu)中,具體包括以下幾個方面:需要進行歸并的各文件,將其索引保存到一個數(shù)據(jù)結(jié)構(gòu)中。隨著本發(fā)明中的方法應(yīng)用于不同的系統(tǒng)中,保存的文件索引和所用的數(shù)據(jù)結(jié)構(gòu)可能有所不同,可以直接保存文件路徑,也可以保存打開文件對應(yīng)的ifstream對象或者CFile對象等等;采用的數(shù)據(jù)結(jié)構(gòu)可以采用數(shù)組、鏈表、vector等等,對方法本身的實現(xiàn)并無影響;本實施例中,數(shù)據(jù)歸并相關(guān)算法使用C++實現(xiàn),故采用vector作為保存數(shù)據(jù)文件索引的數(shù)據(jù)結(jié)構(gòu),使用if stream將數(shù)據(jù)文件打開并且將其指針添加到vector中。另外,本次處理的測試數(shù)據(jù)屬于哪些變量也是必須的信息,每個變量的值使用一個字符串保存下來,每個變量的ID對應(yīng)一個字符串組成一對,將其保存入map中,本map用于保存在一個時間標簽內(nèi)的所有變量的值,將其命名為id_value_map。定義一個vector用于記錄每個時間標簽內(nèi)或者說每個時刻值哪些變量發(fā)生了變化,在本發(fā)明所述方法中,歸并后的數(shù)據(jù)文件每一行記錄一個時間標簽的所有測試數(shù)據(jù),在行尾用分號分割的字符串將哪些變量有變化表示出來,例如:第一二列數(shù)據(jù)在本時刻有變化則行尾字符串為I; 2,在數(shù)據(jù)處理過程中將變量是否變化的信息保存在vecModifiedCols中。
[0034]步驟五:按照順序?qū)λ袛?shù)據(jù)文件進行處理,遍歷文件中所有數(shù)據(jù),如果發(fā)現(xiàn)某一幀數(shù)據(jù)只有時間標簽和ID沒有保存變量值,則從前一幀數(shù)據(jù)中獲取變量值補齊本幀數(shù)據(jù)。
[0035]步驟六:遍歷所有的文件,獲取文件中第一幀數(shù)據(jù),由于所有文件中的數(shù)據(jù)都是各實時仿真節(jié)點按照時序關(guān)系進行收集的,所以文件的第一幀數(shù)據(jù)肯定是本文件中時間標簽最小的一幀,也就是說產(chǎn)生時間最早的一幀數(shù)據(jù)。比較各個文件的第一幀數(shù)據(jù)得到其中時間標簽最小的一幀數(shù)據(jù)。從多幀數(shù)據(jù)中獲取時間標簽最小的一幀有多種方法可以實現(xiàn),可以循環(huán)比較也可以采用各種方式排序后獲得,多種方法間只是存在效率上的差異,對功能的實現(xiàn)并沒有差別。在本實施例中,采用C++標準庫中的min_element算法實現(xiàn)。如果獲取某一文件第一幀數(shù)據(jù)失敗,則說明該文件中的數(shù)據(jù)已經(jīng)全部被獲取,從保存文件索引的數(shù)據(jù)結(jié)構(gòu)中將其刪除,下次遍歷不必再打開這個文件。
[0036]步驟七:判斷所獲得的這幀數(shù)據(jù)中的時間標簽是否與記錄的上一幀數(shù)據(jù)的時間標簽相等,如果不相等,則說明這是屬于新的時間標簽的測試數(shù)據(jù),故前一個時間標簽的所有測試數(shù)據(jù)都已獲取完畢,應(yīng)該將上一時間標簽的測試數(shù)據(jù)都輸出到歸并后的輸出文件中。如果相等則說明這一行數(shù)據(jù)還沒有拼接完成,不需要向輸出文件中寫數(shù)據(jù),繼續(xù)進行步驟八即可;這些數(shù)據(jù)在輸出文件中應(yīng)該存在于同一行。首先向文件中寫入時間標簽,然后從id_value_map中獲取變量的值,按照順序輸出到同一行,最后將vecModifiedCols拼成一個以分號分割的字符串輸出到行尾。每列中間可以空格或者制表符進行分割,該分割符只要能將各列分開即可,對本發(fā)明中的方法實現(xiàn)沒有影響。本實施例中采用制表符進行分割。輸出一行數(shù)據(jù)后將vecModifiedCols清空以便保存下一行數(shù)據(jù)的變量變化信息。如果是第一幀數(shù)據(jù)也就是說上一幀數(shù)據(jù)的時間標簽為0則不需要向輸出文件中寫數(shù)據(jù)。
[0037]步驟八:將當前獲取的這幀測試數(shù)據(jù)的時間標簽更新到last_lable中,以便下次獲取測試數(shù)據(jù)后進行比較;同時根據(jù)這幀測試數(shù)據(jù)中的變量ID獲取變量在步驟四所述id_value_map中的位置,將所得位置信息插入到mapModif iedCo Is中并且將變量的值寫入步驟四所述id_value_map中對應(yīng)的位置。從id_value_map中獲得變量位置信息可以采用多種算法,使用迭代器遍歷map比較變量ID或者是使用map的find函數(shù)進行查找等方法都可以,對本發(fā)明中的方法本身的實現(xiàn)沒有影響。本實施例中調(diào)用C++標準算法中的find_if算法實現(xiàn)該功能。
[0038]步驟九:循環(huán)執(zhí)行步驟六到步驟八,直至所有文件都已讀取完畢,此時保存文件索引的數(shù)據(jù)結(jié)構(gòu)為空,id_Value_map中存有最后一行的測試數(shù)據(jù),將其寫入輸出文件中即完成多路測試數(shù)據(jù)歸并操作。
[0039]本發(fā)明未詳細闡述部分屬于本領(lǐng)域公知技術(shù)。
[0040]以上所述,僅為本發(fā)明部分【具體實施方式】,但本發(fā)明的保護范圍并不局限于此,任何熟悉本領(lǐng)域的人員在本發(fā)明披露的技術(shù)范圍內(nèi),可輕易想到的變化或替換,都應(yīng)涵蓋在本發(fā)明的保護范圍之內(nèi)。
【權(quán)利要求】
1.一種分布式實時測試系統(tǒng)多路測試數(shù)據(jù)壓縮與歸并方法,其特征在于:它包括以下步驟: 步驟一:減少測試數(shù)據(jù)的收集次數(shù);測試系統(tǒng)收集數(shù)據(jù)的方式有兩種,一種是需要按照某個時間間隔收集的數(shù)據(jù),比如按照5ms的周期采集模擬量或者每隔Ims查詢某個接口上的電平是否變?yōu)楦唠娖?;另一種方式是不需要主動地收集數(shù)據(jù),比如串口上的數(shù)據(jù)只需在板卡檢測到總線上有新數(shù)據(jù)并觸發(fā)中斷才收集數(shù)據(jù);通過對這兩種數(shù)據(jù)進行區(qū)分并確立不同的收集策略,減少測試過程中需要傳送的測試數(shù)據(jù),這是對測試數(shù)據(jù)進行的第一層壓縮處理; 步驟二:在收集數(shù)據(jù)的過程中,每一幀測試數(shù)據(jù)包含以下信息:變量ID,收集到數(shù)據(jù)的時刻對應(yīng)的時間標簽,變量的數(shù)值;變量ID用于區(qū)分測試過程中的各個不同的變量,時間標簽用于把當前收集到的數(shù)據(jù)和歷史數(shù)據(jù)進行區(qū)分;在設(shè)計中,每一幀數(shù)據(jù)在存放到一級緩存中之前,對緩存中前一幀數(shù)據(jù)進行比對,如果變量ID與變量值都相同,則只在緩存中添加一幀時間標簽和變量ID,不需要再收集重復的變量值;由于不需要移動緩存的索引,不需要進行指針運算操作,這種比較消耗很小,然而在以很高頻率收集某個變量值的情況下可以去掉很多冗余信息;在測試完成后分析數(shù)據(jù)的時候,只要從前一幀數(shù)據(jù)中獲取變量的值即可還原所有的測試數(shù)據(jù); 步驟三:測試過程中主控節(jié)點將實時仿真節(jié)點傳來的測試數(shù)據(jù)按照節(jié)點保存到不同的文件中;測試過程中實時仿真節(jié)點將測試數(shù)據(jù)發(fā)送到主控節(jié)點,主控節(jié)點把測試數(shù)據(jù)保存到磁盤文件中,每個實時仿真節(jié)點對應(yīng)一個文件,由于實時仿真節(jié)點發(fā)送數(shù)據(jù)的過程具有時序性,故文件中的數(shù)據(jù)已經(jīng)按照時間標簽進行了排序,測試停止后對測試數(shù)據(jù)進行還原和歸并處理; 步驟四:對數(shù)據(jù)歸并處理進行準備;獲取數(shù)據(jù)歸并處理需要的信息并將信息保存到數(shù)據(jù)結(jié)構(gòu)中,具體包括以下幾個方面:需要進行歸并的各文件,將其索引保存到一個數(shù)據(jù)結(jié)構(gòu)中;在不同的系統(tǒng)中,保存的 文件索引和所用的數(shù)據(jù)結(jié)構(gòu)可能有所不同,可以直接保存文件路徑,也可以保存打開文件對應(yīng)的ifstream對象或者CFile對象;采用的數(shù)據(jù)結(jié)構(gòu)采用數(shù)組、鏈表、vector,對方法本身的實現(xiàn)并無影響;另外,本次處理的測試數(shù)據(jù)屬于哪些變量也是必須的信息,每個變量的值使用一個字符串保存下來,每個變量的ID對應(yīng)一個字符串組成一對,將其保存入map中,本map用于保存在一個時間標簽內(nèi)的所有變量的值,將其命名為id_value_map ;定義一個vector用于記錄每個時間標簽內(nèi)或者說每個時刻值哪些變量發(fā)生了變化,歸并后的數(shù)據(jù)文件每一行記錄一個時間標簽的所有測試數(shù)據(jù),在行尾用分號分割的字符串將哪些變量有變化表示出來,例如:第一二列數(shù)據(jù)在本時刻有變化則行尾字符串為I; 2,在數(shù)據(jù)處理過程中將變量是否變化的信息保存在vecModifiedCols中; 步驟五:按照順序?qū)λ袛?shù)據(jù)文件進行處理,遍歷文件中所有數(shù)據(jù),如果發(fā)現(xiàn)某一幀數(shù)據(jù)只有時間標簽和ID沒有保存變量值,則從前一幀數(shù)據(jù)中獲取變量值補齊本幀數(shù)據(jù);步驟六:遍歷所有的文件,獲取文件中第一幀數(shù)據(jù),由于所有文件中的數(shù)據(jù)都是各實時仿真節(jié)點按照時序關(guān)系進行收集的,所以文件的第一幀數(shù)據(jù)肯定是本文件中時間標簽最小的一幀,也就是說產(chǎn)生時間最早的一幀數(shù)據(jù);比較各個文件的第一幀數(shù)據(jù)得到其中時間標簽最小的一幀數(shù)據(jù),如果獲取某一文件第一幀數(shù)據(jù)失敗,則說明該文件中的數(shù)據(jù)已經(jīng)全部被獲取,從保存文件索引的數(shù)據(jù)結(jié)構(gòu)中將其刪除,下次遍歷不必再打開這個文件;步驟七:判斷所獲得的這幀數(shù)據(jù)中的時間標簽是否與記錄的上一幀數(shù)據(jù)的時間標簽相等,如果不相等,則說明這是屬于新的時間標簽的測試數(shù)據(jù),故前一個時間標簽的所有測試數(shù)據(jù)都已獲取完畢,應(yīng)該將上一時間標簽的測試數(shù)據(jù)都輸出到歸并后的輸出文件中;如果相等,則說明這一行數(shù)據(jù)還沒有拼接完成,不需要向輸出文件中寫數(shù)據(jù),繼續(xù)進行步驟八即可;這些數(shù)據(jù)在輸出文件中應(yīng)該存在于同一行,首先向文件中寫入時間標簽,然后從id_value_map中獲取變量的值,按照順序輸出到同一行,最后將vecModifiedCols拼成一個以分號分割的字符串輸出到行尾;每列中間可以空格或者制表符進行分割,該分割符只要能將各列分開即可;輸出一行數(shù)據(jù)后將vecModifiedCols清空以便保存下一行數(shù)據(jù)的變量變化信息,如果是第一幀數(shù)據(jù)也就是說上一幀數(shù)據(jù)的時間標簽為0則不需要向輸出文件中寫數(shù)據(jù); 步驟八:將當前獲取的這幀測試數(shù)據(jù)的時間標簽更新到last_lable中,以便下次獲取測試數(shù)據(jù)后進行比較;同時根據(jù)這幀測試數(shù)據(jù)中的變量ID獲取變量在步驟四所述id_value_map中的位置,將所得位置信息插入到mapModifiedCols中并且將變量的值寫入步驟四所述id_value_map中對應(yīng)的位置; 步驟九:循環(huán)執(zhí)行步驟六到步驟八,直至所有文件都已讀取完畢,此時保存文件索引的數(shù)據(jù)結(jié)構(gòu)為空,id_Value_map中存有最后一行的數(shù)據(jù),將其寫入輸出文件中即完成多路測試數(shù)據(jù)歸并操作。`
【文檔編號】G06F17/30GK103488564SQ201310418563
【公開日】2014年1月1日 申請日期:2013年9月13日 優(yōu)先權(quán)日:2013年9月13日
【發(fā)明者】楊順昆, 劉斌, 司維 申請人:北京航空航天大學