2012-03-17 11 views
1

私は概念的な質問があります。実行時間を短縮する

データセットを入力として処理し、処理して出力をアレイに書き込む手続き(任意の言語)があるとします。この配列は、さらに処理するためにストリームの下で使用されます。問題は、コードが実行時間が長いことです。それはそれが最適化する必要があるほど大きいです!

私が提案しているのは、入力データセットをより小さなチャンクに分割し、パラレルに設定された各データのプロシージャを呼び出すことです。シンプルに聞こえる!

私は別のファイルに手順を書いて、別の実行可能ファイルを作成すると考えました。バッチ処理のためのより小さいデータセットに対してこの実行可能ファイルを送信します。

しかし、この方法の問題点は、バッチジョブのそれぞれが別々のプロセスであるため、これらのすべてのジョブから先に作成したアレイを作成する方法です。各ジョブの出力をファイルに書き込んだ後、それらを処理してアレイバックを作成することも考えられます。

もっと良い方法が並行して実行できますか?ご提案のための

感謝:)

+4

[MapReduce](http://en.wikipedia.org/wiki/Map_Reduce)について説明しています。 –

+0

ありがとうございます。私はそれについて何も知らない。任意の理想的なその自由に利用可能な場合、それを使用して多くの仕事になるか? – Richeek

答えて

1

MapReduceのように見えます。

Erlangは、プロセス、プロセッサ、マシン間で作業を分割して配布する非常に洗練された方法をサポートしています。

Joe ArmstrongのErlangの書籍 "Erlang - 並行ソフトウェアのプログラミング"では、プロセス全体で使用できる単純なMapReduceを提供しています。

私はジョーの簡単なMapReduceのについて話これらのブログが見つかりました:
http://bc.tech.coop/blog/070520.html
http://bc.tech.coop/blog/070601.html
アイデアを説明するかもしれない、とErlangのコードを示します。

Erlangはオープンソースなので、わずかな投資で時間をかけて実験を行うことができます。 言語には並行性とコミュニケーションが組み込まれており、すべてが単一のマシン上で「そのまま」動作します。 Erlang Virtual Machinesが通信できるように 'キー'を設定する必要がありますが、これが完了すると、ローカルエリアネットワークを介してプログラムを実行することができます。

1

オリはあなたの言語で利用可能なMapReduceのソリューションを調査することは良いことです言ったように。これを行う具体的な方法は、理論的にも技術的にも問題に依存します。

ここでは、回答に役立つ質問があります。分散アルゴリズム(センターノードなし)を使用できますか?センターノードを使用して計算を同期させることはできますか(たとえば、データベース内)?バッチ処理時間は、ファイルioを何か長いとみなすのに十分小さいのですか?はいの場合、どのような種類のネットワーク層を使用できますか?私たちは1台のコンピュータで動作し、IPCのニーズはありますか?

+0

私はプログラムの実行時間がファイルI/O時間以上であるため、今はもっと簡単な解決法があると思います。したがって、すべてのデータをファイルに書き込んだり、後でファイル処理でデータをマージすることができます。私は正確に分散アルゴリズムを持っていません。別のサーバーにジョブを送信することによって、複数の入力データセットで実行する逐次アルゴリズムです。 – Richeek

+0

これは分散アルゴリズムの一種です。コードがマルチスレッド化されていない場合は、コンピュータごとにプログラムの複数のインスタンスを実行して、すべてのavailable CPUを使用することを検討できます。 – AsTeR

+0

はいこれは私がやることです...すべての計算がすべてのCPUで行われると、生成されたすべてのファイルをマージします:-) – Richeek