6

私は、さまざまなデータベースで 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
4

2 に答える 2

0

さて、あなたは 2 つのテキスト ファイルを比較しています。各ファイルには、必ずしも順不同のエントリがあります。エントリには特定の形式があると予想しています。この権利を理解していれば、実際には次のようになります。 * エントリの開始を表す @ エントリの終了を表すので、OLD.TXT *a@*b@*c@ など... 粗雑な「アルゴリズム」は次のようになります。1) NEW のコピーを作成し、ADDED と呼びます 2) エントリを取得しますOLD 3.0) そのエントリのスキャンが追加されました。そこにある場合は、STILLEXISTS というファイルにエントリを保存し、ADDED ファイルからそのエントリを削除します。3.1) エントリが ADDED にない場合は、DELETED というファイルに保存し、OLD から次のエントリを取得します。 3 つのファイル、それぞれに追加、削除されたエントリ、およびボーナスの「まだそこにある」ファイルがすべて 1 つのパスに含まれています ;) 正しく理解できたと思います。これがお役に立てば幸いです。

于 2013-07-24T02:10:03.980 に答える