0

私は毎晩実行し、一連の企業に対して多くのデータ分析を行うプロセスを持っています。これは、会社リストを実行するforループで実行しています。このプロセスが完了するまでに約1時間かかる場合があります。時々それが原因の間にクラッシュするいくつかのエラーの原因。手動で再起動する必要があり、残りのすべての会社の分析が処理されます。

それぞれのforループの実行は別の会社のデータ分析であるため、forループ内でマルチスレッド化することは良い解決策である必要がありますか?

提案をありがとう。

4

3 に答える 3

4

ThreadPoolExecutorはあなたの友達です!

于 2012-09-22T01:39:15.910 に答える
2

それぞれのforループの実行は別の会社のデータ分析であるため、forloop内でマルチスレッド化することは良い解決策になるはずですか?

たぶんそうだけどたぶん違う。

事実を見てみましょう:

このプロセスが完了するまでに約1時間かかる場合があります

それ自体では、これは問題にはならないはずです。1時間は長くはありません。特に、12時間以内の時間枠があるためです。

また、マルチスレッドは必ずしも経過時間を大幅に短縮するわけではありません。これは、タスクの性質、処理アルゴリズム、およびハードウェアとシステムの構成の性質によって異なります。

時々それが引き起こす間にクラッシュするいくつかのエラーの原因(何?)。

マルチスレッドはそれを修正しません。各会社を別々のスレッドで実行する場合でも、同じエラーが発生すると、そのスレッドがクラッシュします。また、エラーの原因とエラーの結果によっては、ある会社のクラッシュによって他の会社もクラッシュする可能性があります...または他の方法で正しく機能しなくなる可能性があります。

手動で再起動する必要があり、残りのすべての会社の分析が処理されます。

スレッディングもそれを完全に修正するわけではありません。

それでも、元のクラッシュの原因となった問題を修正してから、手動で再起動する必要があります。また、再実行が必要な会社を区別して記録し、他の会社を不必要に繰り返さないようにするという問題がまだあります。

要約すると、マルチスレッドはアプリケーションを高速化する可能性があります(おそらくIMOになります)が、根本的な問題を解決できるとは思いません...データの不良またはバグが原因で処理が失敗するようです。


最後に、技術的なレベルでは、各企業のスレッドを単純に実行することはおそらく悪い考えです。並行して作業を行おうとすると、スレッドはローカルリソースとバックエンドデータベース上のリソースをめぐって競合します。プールサイズが制限されているThreadPoolExecutorのようなものを使用することをお勧めします。

于 2012-09-22T03:11:20.653 に答える
0

エラー処理用のラッパーを追加してみませんか...ログに記録してエラーが発生した場合は続行してください...エラーが発生した場合に再起動する必要はありません。

for( your company list){
try{
    your tasks
}catch(Exception){
//log error and proceed

}

あなたのタスクはあなたの会社リストに対して独立していますか?その場合は、各タスクを処理するための新しいスレッドを作成できます。そうでない場合は、必要な順序で順番に処理できます。

于 2012-09-22T01:51:28.220 に答える