私は、さまざまなデータベースで ETL 作業を行う会社で働いています。私は、クライアント マシンで 2 つの完全な履歴データ セットのパッチを作成し、それをサーバーに送信する任務を負っています。このパッチは、ソフトウェアから呼び出すことができるようにプログラム化する必要があります。
データセットは単純なテキスト ファイルです。抽出を実行するために、クライアントのシステムで実行されている抽出ソフトウェアがあります。抽出ファイルのサイズは、最大 3 GB 以上です。Microsoft の FC.exe を使用してソリューションを実装しましたが、制限があります。
FC を使用して比較ファイルを作成し、それを perl で解析して、削除/更新されたレコードと追加されたレコードを抽出しています。
FC は、テキスト行が 128 文字を超えない限り、私にとっては問題なく機能します。その場合、出力は比較ファイルの次の行に置かれるため、追加/削除されたレコードとして表示されます。おそらくファイルを前処理できることはわかっていますが、これにより膨大な時間が追加され、おそらく目的が達成できなくなります。
diffutils を使用してみましたが、大きなファイルについて不平を言っています。
また、パッチ プロセスを自分で実装するために、いくつかの C# コードをいじりました。これは小さなファイルではうまくいきましたが、大きなファイルを扱うときはひどく非効率的でした (2.8 GB の抽出でテストしました)。
このパッチ ファイルの作成に使用できるコマンド ライン ユーティリティまたは C# ライブラリはありますか? それを除けば、これを自分で実装するために使用できるアルゴリズムはありますか? レコードは更新、追加、および削除される可能性があることに注意してください (クライアントがレコードを非アクティブとマークするのではなく、レコードを削除するのは私もイライラします。これは私の制御範囲外です。)
わかりやすくするために編集します。
2 つの異なる時点からの 2 つの別個のデータベース抽出を比較する必要があります。通常、これらの間隔は約 1 日です。
以下のファイルを考えると:(これらは明らかにはるかに長く、はるかに広くなります)
古い.txt
a
b
c
d
e
1
f
2
5
New.txt
a
3
b
c
4
d
e
1
f
g
予想される出力は次のようになります。
3 added
4 added
2 removed
g added
5 removed