本發(fā)明涉及文件處理領域,尤其涉及文件比對方法和設備。
背景技術:目前,在比對文件時通常需要將對比的文件全部讀入內(nèi)存中來進行處理,這往往會大量占用系統(tǒng)資源,導致效率較低。為了解決該問題,在現(xiàn)有技術,例如公開號為CN102693302A、發(fā)明名稱為“快速文件比對方法、系統(tǒng)及客戶端”的發(fā)明專利中,提出了一種基于標識樹的文件系統(tǒng)比對方法。在該發(fā)明專利中,發(fā)明人提出對本地文件目錄進行掃描分析,并根據(jù)本地文件系統(tǒng)的變化來更新客戶端維護的標識樹。標識樹中的各個節(jié)點與客戶端的本地文件系統(tǒng)結構中的各個目錄相對應。通過標識樹中逐個節(jié)點之間的比較,可以快速發(fā)現(xiàn)差異節(jié)點,找出變化文件。這種方案或許對找出變化文件有效,但并不能解決文件比對時效率低下的問題,更不能解決遇到大文件或超大文件(例如單個文件大小超過1GB的文件)比較時,內(nèi)存出現(xiàn)瓶頸,甚至出現(xiàn)程序崩潰的問題。
技術實現(xiàn)要素:為解決上述問題,根據(jù)本發(fā)明的一個方面,提供了一種文件比對方法,包括:對所述文件中的數(shù)據(jù)進行分塊讀取;對于已經(jīng)分塊讀取的數(shù)據(jù),按照適當?shù)姆绞竭M行數(shù)據(jù)比對;如果所述數(shù)據(jù)之間的索引不匹配,則在索引數(shù)組中進行二次匹配,其中,所述索引數(shù)組用于存放比對過程中沒有匹配的索引記錄,以及將比對的結果輸出到結果文件中。在上述方法中,分塊讀取的數(shù)據(jù)為固定大小的數(shù)據(jù)塊。在上述方法中,對所述文件中的數(shù)據(jù)進行分塊讀取包括:讀入固定大小的數(shù)據(jù)塊;判斷讀入的數(shù)據(jù)塊中末位是否為行結束符或文件結束符;以及如果讀入的數(shù)據(jù)塊中末尾既不是行結束符也不是文件結束符,則刪除最后一個行結束符后的數(shù)據(jù),并將下一次讀取起始位置設置為最后一個行結束符位置。在上述方法中,所述分塊讀取與所述數(shù)據(jù)比對并行執(zhí)行。在上述方法中,對于已經(jīng)分塊讀取的數(shù)據(jù),按照適當?shù)姆绞竭M行數(shù)據(jù)比對包括:提取兩邊對比數(shù)據(jù)的索引;以及如果索引匹配的話,則對所述數(shù)據(jù)按行進行拆分比對。在上述方法中,在索引數(shù)組中進行二次匹配包括:遍歷所述索引數(shù)組;以及如果存在匹配的索引,則對該索引指定的行數(shù)據(jù)進行比較,并在所述索引數(shù)組中刪除該索引;如果不存在匹配的索引,則將與該索引對應的信息寫入所述索引數(shù)組中。根據(jù)本發(fā)明的另一個方面,提供了一種用于對文件進行比對的設備,包括:文件塊讀取裝置,用于對所述文件中的數(shù)據(jù)進行分塊讀??;文件數(shù)據(jù)比對裝置,用于對于已經(jīng)分塊讀取的數(shù)據(jù),按照適當?shù)姆绞竭M行數(shù)據(jù)比對;二次匹配裝置,用于在所述數(shù)據(jù)之間的索引不匹配時在索引數(shù)組中進行二次匹配,其中,所述索引數(shù)組用于存放比對過程中沒有匹配的索引記錄,以及結果輸出裝置,用于將比對的結果輸出到結果文件中。在上述設備中,分塊讀取的數(shù)據(jù)為固定大小的數(shù)據(jù)塊。在上述設備中,所述文件塊讀取裝置配置成讀入固定大小的數(shù)據(jù)塊;判斷讀入的數(shù)據(jù)塊中末位是否為行結束符或文件結束符;以及在讀入的數(shù)據(jù)塊中末尾既不是行結束符也不是文件結束符時刪除最后一個行結束符后的數(shù)據(jù),并將下一次讀取起始位置設置為最后一個行結束符位置。在上述設備中,所述文件塊讀取裝置與所述文件數(shù)據(jù)比對裝置并行執(zhí)行。在上述設備中,所述文件數(shù)據(jù)比對裝置配置成提取兩邊對比數(shù)據(jù)的索引;以及如果索引匹配的話,則對所述數(shù)據(jù)按行進行拆分比對。在上述設備中,所述二次匹配裝置配置成遍歷所述索引數(shù)組;以及在存在匹配的索引時對該索引指定的行數(shù)據(jù)進行比較,并在所述索引數(shù)組中刪除該索引,而在不存在匹配的索引時將與該索引對應的信息寫入所述索引數(shù)組中。本發(fā)明提出了一種文件比較的分塊處理機制,針對大型文件(單個文件大小超過1G的文件)的比對,不直接將文件讀入內(nèi)存,而是預設一個的最大讀入字節(jié)量,按照最大讀入字節(jié)量對文件進行分塊讀入。分塊時不需要對文件進行預處理,不需要遍歷文件,只需按照字節(jié)偏移量讀入。文件全部讀取完畢前,不關閉文件句柄,減少IO消耗。針對讀取的塊數(shù)據(jù),依照索引,按行對文件內(nèi)容進行比對,極大的減小內(nèi)存和CPU的壓力。在分塊文件比對過程中,會在內(nèi)存中保留兩邊沒有匹配上的數(shù)據(jù)索引數(shù)組。在對下一塊數(shù)據(jù)進行比對時,若沒有匹配到索引,則去沒有匹配上的索引數(shù)組中去匹配。若存在,則進行比對后對索引數(shù)組中該條記錄進行釋放;若不存在,則將該條索引存入索引數(shù)組。這種方法解決了亂序文件在分塊比對時容易匹配出錯的問題。與現(xiàn)有的文件比對機制相比,本發(fā)明提出的方法和設備在保證了中小型文件比較時的高效率的同時,解決了大型文件和超大型文件比較時效率低下及內(nèi)存瓶頸的問題。附圖說明在參照附圖閱讀了本發(fā)明的具體實施方式以后,本領域技術人員將會更清楚地了解本發(fā)明的各個方面。本領域技術人員應當理解的是:這些附圖僅僅用于配合具體實施方式說明本發(fā)明的技術方案,而并非意在對本發(fā)明的保護范圍構成限制。圖1是根據(jù)本發(fā)明的一個實施例的文件比對方法的示意圖;圖2是根據(jù)本發(fā)明的一個實施例的文件比對方法的流程圖;圖3是根據(jù)本發(fā)明的一個實施例、文件塊大小確定的流程圖;圖4是根據(jù)本發(fā)明的一個實施例、文件塊數(shù)據(jù)讀入的流程圖。具體實施方式下面介紹的是本發(fā)明的多個可能實施例中的一些,旨在提供對本發(fā)明的基本了解,并不旨在確認本發(fā)明的關鍵或決定性的要素或限定所要保護的范圍。容易理解,根據(jù)本發(fā)明的技術方案,在不變更本發(fā)明...