簡體   English   中英

如何比較非常大的csv文件中的差異

[英]How to compare differences in very large csv files

我必須比較兩個大小為2-3 GB的 csv文件,包含在Windows平台中。

我試圖將第一個放在HashMap中與第二個進行比較,但結果(如預期的那樣)是一個非常高的內存消耗。

目標是獲取另一個文件的差異。

這些行可能會以不同的順序出現,也可能會錯過。

任何建議?

假設您希望通過編程在Java中執行此操作,答案是不同的。

兩個文件都是訂購的嗎? 如果是這樣,那么你不需要讀入整個文件,只需從兩個文件的開頭開始,然后

  1. 如果條目匹配,則在兩個文件中前進“當前”行。
  2. 如果條目不匹配,請確定首先顯示哪個文件的行,顯示該行,然后前進該文件中的當前行。

如果您沒有有序文件,那么也許您可以在diff之前訂購文件。 同樣,由於您需要低內存解決方案,請不要讀取整個文件以對其進行排序。 將文件切換為可管理的塊,然后對每個塊進行排序。 然后使用插入排序來組合塊。

unix命令diff 可以用於完全匹配。

您也可以使用-b標志運行它以忽略僅有空格的差異。

使用uniVocity解析器,因為它帶有最快的Java解析器。 您可以快速處理大至100 GB的文件而不會出現任何問題。

為了比較大型CSV文件,我建議您使用自己的RowProcessor實現並將其包裝在ConcurrentRowProcessor中

披露:我是這個圖書館的作者。 它是開源和免費的(Apache V2.0許可證)。

我建議你逐行比較,而不是將整個文件上傳到內存中。 或者嘗試只上傳一組線。

有一個用於解析CSV文件的Java庫OpenCSV 可以構建延遲加載文件。 看看這篇文章 希望能幫助到你。

這是Stack Overflow上的另一篇類似文章,其中我給出了一個解決方案的大綱,該解決方案只需要將兩個文件中較小的一個存儲在內存中:

如何比較兩個大型CSV文件並獲取差異文件

這是一般解決方案,不需要對文件進行排序,因為您在說明行的順序可能不同的問題。

無論如何,即使這樣也可以避免。 我不想在這里重復解決方案,但想法是索引一個文件,然后瀏覽另一個文件。 通過僅保存索引中每行的哈希表和位置,可以避免將整個較小的文件存儲在內存中。 這樣,您將不得不在磁盤上多次觸摸該文件,但您不必將其保留在內存中。

算法的運行時間為O(N + M)。 內存消耗為O(min(N,M))。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM