2012-05-17 116 views
1

如何比較不同我有兩個CSV文件,比較大小2-3 GB每一個,包含在Windows平臺。非常大的CSV文件

我試圖把一個HashMap中第一個把它與第二個比較,但結果(如預期)是一個非常高的內存cosumption。

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

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

任何暗示?

+7

你是什麼意思由「比較」?你只是想知道它們是否相同,或者你是否在尋找更像差異化工具的東西? –

+1

更多細節將有所幫助。就像這些文件是有序的,所以你可以假設他們將有相同的行(如果是的話,你可以並行地遍歷它們顯示diff差不多像diff命令或它的任何圖形等價物)。 –

+0

您是否嘗試過任何衆多的「差異」工具? –

回答

1

假設你希望在Java中這樣做,通過編程,答案是不同的。

是否訂購了這兩個文件?如果是這樣,那麼你就需要在整個文件的讀取,你只需在開始這兩個文件的開頭,

  1. 如果條目匹配,推進兩個文件中的「當前」行。
  2. 如果輸入不匹配,確定文件的行會來這第一次,顯示該行,並推進當前行在該文件中

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

1

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

2

unix command diff可以工作的確切匹配。

您也可以與-b標誌運行它忽略空白唯一的區別。

+0

對不起,這是針對windows平臺的 – richarbernal

+0

差異存在於Windows平臺上,但您需要安裝它。您可以安裝獨立的可執行文件(標準GNU工具的窗口有一個端口),也可以安裝cygwin,它還將提供bash shell和許多unix兼容性層。 –

+0

非常感謝@Edwin Buck,但我需要在Java下控制程序 – richarbernal

1

有一個用於解析CSV文件的java庫OpenCSV。可以構建文件的延遲加載。檢查this article。希望能幫助到你。

1

使用uniVocity-parsers,因爲它帶有最快的Java Java解析器。您可以很快處理大小爲100 GB的文件,而不會有任何問題。

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

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

0

這裏是一個堆棧溢出其他類似的帖子中,我都給予瞭解決方案僅需要兩個文件的小存儲在內存中的輪廓:

How to compare two large CSV files and get the difference file

這是一般這個解決方案不需要文件的排序,因爲你在提出這樣的問題,即排序的順序可能不同。

無論如何,即使這是可以避免的。我不想在這裏重複這個解決方案,但想法是索引一個文件,然後遍歷另一個文件。您只需保存索引中每一行的哈希表和位置,就可以避免將整個較小的文件存儲在內存中。這樣,您將不得不在磁盤上多次觸摸該文件,但不必將其保存在內存中。

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