[英]How to compare differences in very large csv files
我必須比較兩個大小為2-3 GB的 csv文件,包含在Windows平台中。
我試圖將第一個放在HashMap中與第二個進行比較,但結果(如預期的那樣)是一個非常高的內存消耗。
目標是獲取另一個文件的差異。
這些行可能會以不同的順序出現,也可能會錯過。
任何建議?
假設您希望通過編程在Java中執行此操作,答案是不同的。
兩個文件都是訂購的嗎? 如果是這樣,那么你不需要讀入整個文件,只需從兩個文件的開頭開始,然后
如果您沒有有序文件,那么也許您可以在diff之前訂購文件。 同樣,由於您需要低內存解決方案,請不要讀取整個文件以對其進行排序。 將文件切換為可管理的塊,然后對每個塊進行排序。 然后使用插入排序來組合塊。
unix命令diff 可以用於完全匹配。
您也可以使用-b
標志運行它以忽略僅有空格的差異。
使用uniVocity解析器,因為它帶有最快的Java解析器。 您可以快速處理大至100 GB的文件而不會出現任何問題。
為了比較大型CSV文件,我建議您使用自己的RowProcessor實現並將其包裝在ConcurrentRowProcessor中 。
披露:我是這個圖書館的作者。 它是開源和免費的(Apache V2.0許可證)。
我建議你逐行比較,而不是將整個文件上傳到內存中。 或者嘗試只上傳一組線。
這是Stack Overflow上的另一篇類似文章,其中我給出了一個解決方案的大綱,該解決方案只需要將兩個文件中較小的一個存儲在內存中:
這是一般解決方案,不需要對文件進行排序,因為您在說明行的順序可能不同的問題。
無論如何,即使這樣也可以避免。 我不想在這里重復解決方案,但想法是索引一個文件,然后瀏覽另一個文件。 通過僅保存索引中每行的哈希表和位置,可以避免將整個較小的文件存儲在內存中。 這樣,您將不得不在磁盤上多次觸摸該文件,但您不必將其保留在內存中。
算法的運行時間為O(N + M)。 內存消耗為O(min(N,M))。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.