質問

データベーステーブルには100万行あります。行ごとに、カスタムexeを実行し、出力を解析して、別のデータベーステーブルを更新する必要があります

複数の行のプロセスを並行して実行するにはどうすればよいですか

現在、単純なデータフロータスクがあります-> GetData->スクリプトの実行(プロセスの実行、出力の解析)->データの保存 6000行の場合は3時間かかりました。多すぎる。

役に立ちましたか?

解決

ここには、各行ごとにプロセスを実行する単一のボトルネックがあります。 「EngineThreads」の増加とにかく、この特定のスクリプト変換を実行するスレッドは1つだけなので、まったく役に立ちません。他の変換に費やされる時間は、おそらくまったく問題ではありません。プロセスは重量のあるオブジェクトであり、数千を実行することは決して安価ではありません。

改善するために、次のアイデアを考えることができます:

1)修正する最良の方法は、カスタムEXEをアセンブリに変換し、スクリプトトランスフォームから呼び出すことです-プロセスの作成、出力の解析などのオーバーヘッドを回避するため

2)個別のプロセスを使用する必要がある場合、これらのプロセスを並行して実行することができます。プロセスがほとんどの入出力を待機している場合(つまり、I / Oバウンド)に役立ちます。プロセスがメモリバウンドまたはCPUバウンドである場合、それらを並行して実行してもあまり勝てません。

2A)複雑なスクリプト、シンプルなパッケージ。

これらを並行して実行するには、スクリプトのProcessInputメソッドを変更してプロセスを非同期に開始し、プロセスの完了を待たずに次の行に移動して次のプロセスを作成します。プロセス出力をサブスクライブし、Exitedイベントを処理するので、いつ終了したかがわかります。並行して実行するプロセスの数を制限します-そうしないと、メモリが不足します。 ProcessInput呼び出しから戻る前に、すべてのプロセスが完了するまで待ちます。

2B)シンプルなスクリプト、複雑なパッケージ。

現在の順次スクリプトを保持しますが、SSISを使用してデータをパーティション分割します。条件付き分割変換を追加し、ハッシュ式に基づいて入力ストリームを複数のストリームに分割します。これにより、各出力がほぼ同じ量のデータを受信するようになります。ストリームの数は、並行して実行するプロセスインスタンスの数に等しくなります。条件分割の各出力にスクリプト変換を追加します。ここで、「エンジンスレッド」も増やす必要があります。 property :)これらの変換は並行して実行されます。 (注:タグに基づいて、SSIS 2008を使用すると仮定します。SSIS2005で機能させるには、追加のUnion All変換を挿入する必要があります)。

これによりパフォーマンスが向上するはずですが、何百万ものプロセスが大量にあります。ここでは本当に良いパフォーマンスを得ることはほとんどありません。

他のヒント

「データフロー」を使用してこのプロセスを実行している場合コンテナの場合、「EngineThreads」というプロパティがあります。デフォルトの値は5です。20などのより大きな数値に設定すると、これらの行の処理により多くのスレッドが割り当てられます。

これは単なるパフォーマンスの調整または最適化です。ssisパッケージの実行速度がまだ非常に遅い場合は、パッケージのアーキテクチャと設計について説明します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top