2011-07-22 13 views
0

でこのデータ移行作業のためのベストの並列プログラミングのアプローチ私は2つのテーブルとSQL Server 2008のデータベースを持っている:マイクロソフト/ .NETスタック

  • 表A列ID (int), XmlDocument (xmlを持っている)
  • 表のB列ID (int), PdfDocument (varbinary)
  • を持っています

私はXmlDocumentをとり、PDFに変換できるいくつかの.NETコードを持っています。私は表Aに130万行あり、すべての行を順番に変換するには、1行/秒= 15日で1.3百万行が必要です。

私は2時間以内にこれをやろうとしています。問題は、並列化のための完全なケースと思われます。私の質問は、これを達成するために何を使用すべきか、そして過去に働いた良いアドバイスがあればどうかです。私は仮想マシンラボにアクセスし、いくつかの仮想マシンをスピンアップすることができます。これはどこでもコピーできるテストデータベースです。

たとえば、SQL(サービスブローカーまたはパラレル化のSQLジョブと変換用のCLRプロシージャーを呼び出す)または.NET(複数のマシン上で複数のプロセスまたは複数のスレッドを同じマシンに持つ必要がありますか私をかなり近づけるでしょうか?)ボトルネックは何ですか?スレッド間で作業を共有するためにどのような戦略を使用すべきかについてのご意見はありますか?

答えて

1

この問題を解決できるさまざまなソリューションがありますが、私は何か新しいことを提案します。雲を使う。

真のボトルネックは、XmlをPDFに変換するコンピューティングパワーであると仮定すると、実質的に無制限のスケールアウトで環境にアクセスすることが最も簡単な方法となります。

2

ボトルネックは間違いなく変換プロセスになるでしょう。私は常に.NETでダイナミックPDFを生成し、小さな2-3ページのドキュメントのほとんどは簡単に数秒(5-8)かかることがあります。あなたが事前に生成し、一時テーブルに格納することができない理由は、あなたがしなければならないことは、あなたの準備ができたらSQL経由で移動することです。また、130万個のPDFが数ギガバイトのストレージを簡単に消費できるため、効率的な(サイズ最適化された)PDFを生成できることを確認してください。

+0

はい、私は事前生成を計画していますが、QAが生成プロセスでバグを見つけた場合には、事前生成する必要があります。 –

1

コンソールプログラムを使用して今のところ使用されていない多数のクライアントマシンで実行する方がずっと簡単なので、これはSQLタイプのジョブではなく.netコンソールアプリケーションとして行います。ドキュメントに何らかのプライマリキーがあると仮定すると、アプリケーションを実行してからプライマリキーを分割する必要のあるクライアントコンピュータの数がわかります。あなたは4つを持っている場合、各アプリは、負荷の約4分の1のキーの分割を取得します。キーの種類に応じて、さまざまな方法を使用して作業するキー範囲を渡すことができます。

アプリケーションでは、作業するレコードを選択してから、Parallel LinqまたはParallel foreachループを使用してそのクライアントのレコードを処理します。どちらも非常に簡単な並列構造で、ループ内にあるものを明示的に処理する必要はありません(フレームワークがスレッドを処理します)。

その時点で、十分な時間を費やして時間枠内で完了することができます。

関連する問題