3

あるデータベースから別のデータベースに大規模なデータセット (数百万のレコード) をインポートするために使用されるアプリケーションがあり、プロセスで差分を実行します (IE で削除されたものを削除したり、更新したりします)。多くの外部キー制約などにより、アプリケーションの処理を高速化しようとするため、宛先データベース全体をメモリにロードしてから、ソース データベースの一部をロードしようとし、メモリ内比較を実行して更新します。それが行くようにメモリ内の目的地。最後に、これらの変更を宛先に書き戻します。データベースは 1 対 1 で一致しないため、一方の単一のテーブルが他方の複数のテーブルになる場合があります。

だから私の質問に: 現在、このプロセスを実行するのに数時間かかります (追加/変更されたデータの量によっては、1 日近くかかることもあります)。これにより、デバッグが非常に困難になります。歴史的に、バグに遭遇した場合、変更を加えてからアプリを再実行し、すべてのデータを再度メモリにロードする必要があり (かなり時間がかかります)、元の部分に到達するまでインポート プロセスを実行します。そして、指を交差させて、変更が機能することを願っています。これは面白くない:(

デバッグ プロセスを高速化するために、インポート コードを別の appdomain に読み込まれる別の dll に移動してアーキテクチャを変更し、アンロード、変更、再読み込みして、インポートのセクションを実行できるようにします。もう一度、中断したところから再開し、より良い結果が得られるかどうかを確認します。この計画を思いついたとき、私は天才だと思いました:)しかし、問題があります。宛先データベースから 2 番目のアプリケーション ドメインにすべてのデータをロードしてから、アンロードする前に、[Serializable] 取引を使用してすべてのデータを最初のアプリケーション ドメインにコピーする必要があります (これは、dll をアンロードして再ロードするときに非常に遅くなります) またはロードします。ホスト appdomain のデータを取得し、MarshalByRefObject を使用して 2 番目にそれを参照します (プロセス全体が遅くなることが判明しました)。

だから私の質問は次のとおりです。どうすればこれをすばやく行うことができますか? のように、最大​​分!参照によって渡されたかのようにデータをコピーするだけで、実際に完全なコピーを行う必要はありません。

これを実装して、データを 2 つの間でより適切に共有したり、少なくともそれらの間で迅速にやり取りしたりできるようにするためのより良い方法があるかどうか疑問に思っていました。データベースの使用を推奨するもの (データベースを回避するためにデータをメモリにロードしている) や、MarshalByRefObject を使用するように言っているものを検索して見つけました。そんな簡単なことをしたいのですが、まだうまくいきません。

C++ dll またはアンマネージ dll をロードすると、アプリ ドメインが無視され、いくつかの問題が発生する可能性があることをどこかで読みました。とにかく私はこれを私の利点に使用することができます.アプリ ドメインをアンロードして、他の dll をアンロードしますか?

これが理にかなっていることを願っています。ここでの最初の質問なので、ひどい仕事をした場合は助けてください。これは数日間私をイライラさせました。

4

2 に答える 2

3

アプリ ドメイン アプローチは、アプリケーションの一部のみをロード/アンロードするために分離する良い方法です。残念ながら、お気づきのように、2 つのアプリ ドメイン間でデータを交換するのは簡単ではありません。これは、通信を試みる 2 つの異なるシステム プロセスが同じプロセス通信よりも常に遅くなるようなものです。そのため、可能な限り最速のプロセス間通信メカニズムを使用することをお勧めします。ここでは不要なオーバーヘッドが発生するため、WCF をスキップします。データを非常に高速にストリーミングできる名前付きパイプを使用します。以前に使用したことがありますが、良い結果が得られました。さらに高速化するにはMemoryMappedFile(リンク) を試すことができますが、実装はより困難です。名前付きパイプから始めて、それが遅すぎる場合は、メモリ マップ ファイルを使用します。

高速な送信方法を使用している場合でも、データのシリアル化という別のボトルネックにぶつかる可能性があります。大量のデータの場合、標準のシリアル化 (バイナリであっても) は非常に遅くなります。Google のプロトコル バッファを参照してください。

AppDomain に関する注意事項 - アプリ ドメインの 1 つで例外がキャッチされないと、プロセス全体が停止します。残念ながら、それらはそれほど分離されていません。

余談ですが。あなたのアプリケーションが何をするのかはわかりませんが、数百万のレコードはそれほど過剰ではないようです。最適化の余地があるのではないでしょうか?

于 2012-05-25T22:20:11.430 に答える
-1

SQL Serverかどうかはわかりませんでしたが、これを行うためにSSISを使用することを検討しましたか?ビッグデータで高速化できる手法がいくつかあることは明らかです。

于 2012-05-25T22:34:57.837 に答える