2013-04-11 48 views
3

我有兩個大的XML文件(3GB,80000條記錄)。一個是另一個的更新版本。我想確定哪些記錄發生了變化(被添加/更新/刪除)。文件中有一些時間戳,但我不確定它們是否可信。與文件中記錄的順序相同。通過記錄比較兩個非常大的XML文件的最佳方法

這些文件太大,無法作爲XML加載到內存中(即使是一個,也不介意)。

我想到的方式是在記錄級別的第一個文件中使用ID的內存映射對內容偏移進行某種解析/索引,然後將第二個文件流化並使用隨機訪問比較兩者中存在的記錄。這可能需要2或3次傳球,但沒關係。但我找不到容易讓我做的圖書館/方法。帶有VTDNavHuge的vtd-xml看起來很有趣,但我無法理解(來自文檔)是否支持基於預先保存的位置的隨機訪問重訪和加載記錄。

Java庫/解決方案是首選,但C#也可以接受。

+1

擴展Vtd- xml支持內存映射,這意味着文檔可能沒有完全加載到內存中。它像標準的vtd-xml一樣支持隨機訪問。當你說你不能在內存中加載文檔時,我認爲擴展vtd可能是正確的選擇,並且應該比sax更易於使用且更快。 – 2013-04-11 05:05:38

+0

當您談論_「文件太大而無法以XML的形式加載到內存中時」_您使用了哪些數據結構? – Killrawr 2013-04-11 07:32:12

+0

如果你找不到任何東西來分析代碼中的文件,還有一些其他解決方案,比如[notepad ++ compare](http://sourceforge.net/projects/npp-compare/)或者opensource項目[winmerge ](http://sourceforge.net/projects/winmerge/?source=dlp) – Killrawr 2013-04-11 07:43:40

回答

1

只需使用SAX或StAX同時解析兩個文檔,直到遇到差異,然後退出。它不會將文檔保存在內存中。任何標準的XML庫都將支持S(t)AX。唯一的問題是,如果你考慮不同的元素順序是不重要的...

+0

我不確定我能保證內部訂單,儘管這可能值得檢查。感謝您的建議。 – 2013-07-23 03:51:26