5

Windows プラットフォームに含まれる、サイズがそれぞれ2 ~ 3 GBの 2 つの csv ファイルを比較する必要があります。

最初のものを HashMap に入れて 2 番目のものと比較しようとしましたが、結果は (予想どおり) 非常に多くのメモリを消費します。

目的は、別のファイルの違いを取得することです。

行は異なる順序で表示される場合があり、見逃される場合もあります。

何か提案はありますか?

4

6 に答える 6

3

プログラミングを介してJavaでこれを行いたいと仮定すると、答えは異なります。

両方のファイルが注文されていますか? その場合、ファイル全体を読み取る必要はなく、両方のファイルの先頭から開始するだけです。

  1. エントリが一致する場合は、両方のファイルの「現在の」行を進めます。
  2. エントリが一致しない場合は、ファイルのどの行が最初になるかを判断し、その行を表示して、そのファイルの現在の行を進めます。

ファイルを注文していない場合は、差分の前にファイルを注文することができます。繰り返しますが、低メモリ ソリューションが必要なため、ファイル全体を読み取って並べ替えないでください。ファイルを扱いやすいチャンクに切り刻み、各チャンクを並べ替えます。次に、挿入ソートを使用してチャンクを結合します。

于 2012-05-17T19:52:07.810 に答える
2

Java 用の最速の CSV パーサーが付属しているため、uniVocity-parsers を使用します。100 GB もの大きなファイルを問題なく、非常に迅速に処理できます。

大きな CSV ファイルを比較するには、RowProcessorの独自の実装を使用し、それをConcurrentRowProcessorでラップすることをお勧めします。

開示:私はこのライブラリの作成者です。オープンソースで無料です (Apache V2.0 ライセンス)。

于 2015-05-20T10:37:31.230 に答える
2

Unix コマンド diff 、完全一致に対して機能します。

-b空白のみの違いを無視するフラグを付けて実行することもできます。

于 2012-05-17T19:47:50.810 に答える
1

ファイル全体をメモリにアップロードするのではなく、行ごとに比較することをお勧めします。または、行のグループだけをアップロードしてみてください。

于 2012-05-17T19:40:27.533 に答える
1

CSV ファイルを解析するための Java ライブラリOpenCSVがあります。ファイルの遅延読み込みを構築できます。この記事をチェックしてください。それが役に立てば幸い。

于 2015-05-19T12:04:37.673 に答える