2011-09-06 9 views
6

large datasetsには、XML形式の何百万ものレコードがあります。これらのデータセットは、特定の時点までのデータベースの完全なデータダンプです。2つの大きなデータセットの違いを確認するにはどうすればよいですか?

2つのダンプの間に新しいエントリが追加され、既存のエントリが変更または削除されている可能性があります。スキーマは変更されず、すべてのエントリに一意のIDがあるとします。

これらの2つのデータセット(削除と更新を含む)間のデルタを判断する最良の方法は何ですか?


私の計画は、すべてをRDBMSにロードしてそこから実行することです。

まず、古いダンプをロードします。新しいダンプを別のスキーマにロードしますが、そうすることで、そのエントリが新しいか、既存のエントリの更新であるかどうかを確認します。 「はい」の場合は、「変更」と呼ばれる新しいテーブルにIDを記録します。

これがすべて完了したら、古いダンプをすべてのエントリに渡し、新しいダンプに一致するレコード(つまり、同じID)があるかどうかを確認します。そうでない場合は、変更にログを記録します。

IDでレコードを検索すると、O(log n)操作であると仮定すると、O(n log n)時間内にすべてを実行できるはずです。

IDと最終更新日だけでレコードの有無を調べることで違いを判断できるため、すべてをメインメモリにも読み込むことができました。時間の複雑さは同じですが、ディスクI/Oが少なくて済むという利点があります。

提案? (注:これは何よりもパフォーマンスに関する質問のほうが多い)

+0

「私が決めることができますので...桁違いにこの速く作るべきです」。 "これは何よりもパフォーマンスの問題です"。 ...メモリでこれを行うsoooははるかに速くなり、主にパフォーマンスに関心があります。あなた自身の質問にあなたが答えたように聞こえる。 – Gerrat

答えて

0

珍しい提案として、gitを使用することを検討してください。最初のデータセットをバージョン管理下に置き、作業ディレクトリを消去して2番目のデータセットにコピーします。 gitはその違いを生み出すのがすごく速いです。

+0

レコードが特定の順序でない場合(つまり、順序が同じであることが保証されていない場合)、gitを処理できますか? – NullUserException

+0

@NullUserException:gitはファイル構造体上で動作します。 Stack Overflowエクスポートについて話しているなら、各質問XMLをquestionid.xmlファイルに格納することができます(確かに、エクスポートを詳細に調べることはありません)。 – Andomar

+0

すべての質問は同じXMLファイルにあります。本当に何百万のXMLファイルを作成しないようにしたい... – NullUserException

0

2つのDataTableの違いを得るためのソリューションを提供するMSDNのこの記事をご覧ください。それは正しい方向にあなたを指している必要があります:

2つのDataTableを比較する方法:
http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/23703a85-20c7-4759-806a-fabf4e9f5be6

ます。また、これを見て取りたいかもしれませんSOあまりにも質問:
Compare two DataTables to determine rows in one but not the other

私はしました

table1.Merge(table2); 
DataTable changesTable = table1.GetChanges(); 
1

レッドゲートのSQL Data Compare

0:また、このアプローチは、数回使用さ見て
+0

私はこれをupvotesの全体の山を与えることができたらいいですね! – thursdaysgeek

0
select 
    coalesce(a.id, b.id) as id, 
    case 
     when a.id is null then 'included' 
     when b.id is null then 'deleted' 
     when a.col != b.col then 'updated' 
    end as status 
from a 
full outer join b on a.id = b.id 
where a.id is null or b.id is null or a.col != b.col 
+0

私はそれを行う方法を知っている、私はこのようなクエリのパフォーマンスをより心配しています。 – NullUserException

+0

@ Nullタイトルは、それをどうやって速くするかではなく、その違いを判断する方法を尋ねます。また、あなたはループを作成したいと思うように見え、それは悪いです。 –

+0

ループなしでデータをロードするにはどうすればよいですか? – NullUserException

1

DeltaXMLをご覧ください。

(パディングStackOverflowのは短い答えを許可していないため)

関連する問題