2010-12-05 9 views
4

私たちはJavaでさまざまな統計分析のためのソフトウェアを実装しようとしています。主なコンセプトは、グラフ上の点の配列を取得し、それを繰り返し、いくつかの結果を見つけることです(最長の上昇シーケンスとさまざまな指標を探すなど)。統計的な呼び掛けの並列性を考慮する必要がありますか?

問題:大量のデータ

Problem2:また、クライアントのPCだけではないサーバー(可能性なし特定のサーバーのチューニング)

部分的な解決策で仕事をする必要があります背景に計算を行うと、ユーザーが空の画面を凝視して結果を待つようにする:(

質問:performancを増やす方法はありますか並列処理を使った計算そのもの(多くの繰り返し)?もしそうなら、記事、サンプル、ここに使えるものへのリンクを提供してください。

答えて

3

要点はが互いにことなく行うことができるデータ又は大型計算多量の存在です。たとえば、多くのスレッドを持つ10000の階乗を、1..1000,1001..2000,2003.3000などの部分に分割し、各部分を処理してから*という結果を累積することでカウントできます。一方、大きなフィボナッチ数を計算するタスクは、後のタスクが前のタスクに依存するため、分割することはできません。

大量のデータと同じです。あなたがポイントの配列を収集し、いくつかの具体的なポイント(より大きい、いくつかの定数、最大のすべて)または統計情報(座標の合計、発生の数)を収集したい場合は、並列計算を使用してください。 「進行中の」情報(最長の上昇シーケンス)を収集する必要がある場合は...これはまだ可能ですが、はるかに困難です。

サーバーとクライアントPCの違いは、クライアントPCにコアが多くなく、のシングルコアの並列計算ではパフォーマンスが低下するだけで、の増加ではないことです。したがって、ユーザーPCのコア数よりも多くのスレッドを作成しないでください(コンピューティングクラスタでも同じです。クラスタ内のコンピュータ数より多くのサブタスクでタスクを分割しないでください)。

Hadoop's MapReduceを使用すると、並列計算を効率的に作成できます。並行して評価することができる、より具体的なJavaライブラリを検索することもできます。たとえば、Parallel Coltは、大きな行列を扱うための高性能の並列アルゴリズムを実装しています。多くのデータ表現にこのようなライブラリがたくさんあります。

+0

"お互いに無事にできる"との良い点。私は確かにそれを念頭に置くでしょう。 – Xorty

+0

フィボナッチは閉じた形式を持ち、パラレルで計算することができます。 (参考:http://en.wikipedia.org/wiki/Fibonacci_number#Relation_to_the_golden_ratio) – whiskeysierra

+0

これは当てはまりますが、ほぼすべてのタスクが数学的な変換によって並列化される可能性があります。問題は、要件を満たすためのタスクの適切な表現を見つけるのにどれくらいの時間がかかるかということです。時間がかかりすぎると、実際にはタスクは並列化不可能として扱われます。それが私の指摘でした。 – ffriend

1

解決しようとしている問題が自然に並列化できるなら、パフォーマンスを向上させるためにマルチスレッドを使用する方法があります。

連続して計算する必要がある部分が多数ある場合(つまり、最初の部分が計算されるまで2番目の部分を計算することはできません)、マルチスレッドは行く方法ではありません。

具体的な問題を説明してください。多分、私たちはあなたにさらなる助けを提供することができます。

2

ローマンに加えて、クライアントのPCに複数のCPU/CPUコア/ハイパースレッディングがあるかどうかを確認する必要があります。単一のコアとハイパースレッディングのない単一のCPUだけがある場合、計算を並列化することによるメリットはありません。それ以外の場合は、計算の性質によって異なります。

並列化する場合は、同時実行性APIを使用できるようにJava 1.5以降を使用してください。実行時に、Runtime.getRuntime().availableProcessors()のようなCPUコアの数を決定します。ほとんどのタスクでは、Executors.newFixedThreadPool(numThreads)のような多くのスレッドを持つスレッドプールを作成し、Executorにタスクを送信したいと思うでしょう。より具体的にするためには、Romanが示唆したように、特定の計算に関する情報を提供する必要があります。並列処理を使用する

+1

洞察に感謝しますが、クライアントのマシンを予測することは不可能です... – Xorty

+0

複数のプロセッサーがあるかどうかを確認し、コアが1つしか見つからない場合は正常な劣化を適用できます。 – whiskeysierra

+0

Xorty、プロセッサの数を動的にチェックし、そのサイズのスレッドプールを作成するのは、クライアントがただ1つのプロセッサコアしか持たない場合、一度に1つのタスクを実行するほうが効率的です。基本的に、あなたのアルゴリズムは、余分な作業をすることなく、Williの提案したようにプロセッサの数に動的に適応します。 – gdj

関連する問題