Windows プラットフォームに含まれる、サイズがそれぞれ2 ~ 3 GBの 2 つの csv ファイルを比較する必要があります。
最初のものを HashMap に入れて 2 番目のものと比較しようとしましたが、結果は (予想どおり) 非常に多くのメモリを消費します。
目的は、別のファイルの違いを取得することです。
行は異なる順序で表示される場合があり、見逃される場合もあります。
何か提案はありますか?
Windows プラットフォームに含まれる、サイズがそれぞれ2 ~ 3 GBの 2 つの csv ファイルを比較する必要があります。
最初のものを HashMap に入れて 2 番目のものと比較しようとしましたが、結果は (予想どおり) 非常に多くのメモリを消費します。
目的は、別のファイルの違いを取得することです。
行は異なる順序で表示される場合があり、見逃される場合もあります。
何か提案はありますか?
プログラミングを介してJavaでこれを行いたいと仮定すると、答えは異なります。
両方のファイルが注文されていますか? その場合、ファイル全体を読み取る必要はなく、両方のファイルの先頭から開始するだけです。
ファイルを注文していない場合は、差分の前にファイルを注文することができます。繰り返しますが、低メモリ ソリューションが必要なため、ファイル全体を読み取って並べ替えないでください。ファイルを扱いやすいチャンクに切り刻み、各チャンクを並べ替えます。次に、挿入ソートを使用してチャンクを結合します。
Java 用の最速の CSV パーサーが付属しているため、uniVocity-parsers を使用します。100 GB もの大きなファイルを問題なく、非常に迅速に処理できます。
大きな CSV ファイルを比較するには、RowProcessorの独自の実装を使用し、それをConcurrentRowProcessorでラップすることをお勧めします。
開示:私はこのライブラリの作成者です。オープンソースで無料です (Apache V2.0 ライセンス)。
Unix コマンド diff は、完全一致に対して機能します。
-b
空白のみの違いを無視するフラグを付けて実行することもできます。
ファイル全体をメモリにアップロードするのではなく、行ごとに比較することをお勧めします。または、行のグループだけをアップロードしてみてください。
CSV ファイルを解析するための Java ライブラリOpenCSVがあります。ファイルの遅延読み込みを構築できます。この記事をチェックしてください。それが役に立てば幸い。