2011-02-17 4 views
0

私はMySQLと通信するPHPで書かれたアルゴリズムを持っています。標準の共有ホスティングサーバーでは、計算に約5秒かかります。私の質問は - どのように私は(もちろんアルゴリズム自体を変更することなく)スピードアップすることができます専用の/ VPSを、おそらくいくつかのクラウドコンピューティングまたは...?クラウドコンピューティング - PHPとMySQL

あなたの提案は何ですか?

編集:それはダイクストラアルゴリズム公共交通機関です。私は3500のユニークな停止点を持っています。

要するに、アクティブストップ、前回の停止、lineToStop、totalTime、travelTimeなどを記録するために複数の配列があります。私はストップの数をループし、ストップのIDを取得し、他のストップ(そのアクティブなストップの時間に基づいて)への接続を構築し、ストップのサイズを再びループして、最も低い値を持つものを見つけ出し、アクティブにしてもう一度続行します。

は、私はそれはとてもo​​ptimizatio問題だ実現 - >Dijkstra algorithm optimization/caching

+1

もっと詳細な説明がない限り、私の最初の提案は、あなたのテーブルをMySQL側で最適化できましたか?つまりインデックスなどですか? – Brian

+0

テーブルに正しいインデックスを定義していないため、9/10回のクエリが遅いです。どのようなホスティングでデータベースを実行するかは問題ではなく、適切なスキーマを作成してクエリをプロファイルする必要があります。 –

+1

@Dan Grossman:またはタイトなループで実行される高速クエリです:for($ i = 1; $ i <100000; $ i ++){mysql_query( "select id from blah"); } 'または、共有ホスティングがオーバーロードされています。またはパイプが薄すぎる。知るか? (一般的には、最適化されていないクエリは非常に一般的です。はい) – Piskvor

答えて

7

航空券を購入するとき、最初の質問は「どこに行きたいですか?」ではありません。 - それは "からへ?"言い換えれば、それほど多くなくても、もっと詳しく、私たちはただ推測しているだけです。

"どうすればスピードアップできますか?"いずれにしても、これは次のとおりです。

測定それは、実際のボトルネックを見つけるボトルネックを取り除く、それが十分に実行されるまで繰り返します。多くのプログラマ-世紀誰かを想像どのような最適化過ごした -

プロファイリングがなければ、あなたは重大なパフォーマンスへの影響を持っていないコードの一部を最適化することに無限の時間を無駄にできた(「実際のボトルネック」に重点を注意してくださいボトルネックになる可能性があります)。

例:プログラムの開始時に一度呼び出され、プログラムがディスクI/Oを待っている時間の90%を費やすメソッドであれば、メソッドを1000%高速化するのは無意味です。もう1つの例は、プログラムが複雑でインデックスのないクエリを実行するSQLサーバーを待っている時間の90%を費やすときに、I/Oボトルネックを防ぐためのディスクアレイを作成することです。それらはあなたが遭遇する唯一の問題ではなく、相互に排他的でもありません - あなたは1つの解決を開始する前にどのような問題があるかを知る必要があります。 "それは遅い"問題の説明ではない、それは単なる症状である(ちょうど "頭痛"が9000の異なる病状の症状であり得るように)。


TL; DR:There is no silver bullet

+0

あなたはその言葉にはかなり良いです。それは顕著な言葉です。 Thx 4ヘルプPiskvor! – JackLB

0

アルゴリズムによって、ボトルネックは、PHPコードやデータベースにあるかどうか、たとえばヒップホップをfacebooksのように、あなたは、PHPのコンパイラを使用して試みることができます: http://developers.facebook.com/blog/post/358/

トラフィックが多いわけではなく、一度実行されるアルゴリズムが高速でなければならないので、おそらくPHPコンパイラ(リンク先のようなもの)が必要です。 (bcompilerやsimilairのような)opcode cacherは、多くのスクリプトを実行するときに役立ちます。

すべてのオペコードをキャッシュすると、スクリプトの解析が高速化されますが、スクリプトの5秒間に1回しか実行されず、おそらくボトルネックはありません。コンパイラはしかし、あなたのPHPコードをネイティブアセンブリに変換します。これは、同等の高速化を達成していなくても、PHPでのランニングよりも平均して2倍高速です。

また、これは設計によって異なります。スクリプトが5秒間のほとんどの時間データベースを待つだけであれば、コンパイルはあまり役に立ちません。

ここではどのようなアルゴリズムについて話していますか?

+0

あなたが特定の数字について話しているので、*特に*未知のアルゴリズムについて - 私たちが知っているすべてのために 'sleep(5) 'になるかもしれません。 – Piskvor

+1

こうして私は単語「depends」を2回使用します)。 – Cray

1

"クラウドコンピューティング"は、計算を向上させる魔法ではありません。それは技術であり、あなたのアルゴリズムを劇的に書き換えて使用する必要があります。ほとんどの場合、SQLデータベースを使用しないでください。

私はあなたがアルゴリズムを最適化し、dbサーバーを調整することによって、はるかに単純な方法と思っています。このような時間は、従来の最適化手法を使用することで、10倍以上、さらにはそれ以上に削減できると確信しています。あなたはすでに、BTWを使用しましたか?

2

まず、ボトルネックがどこにあるかを見つける必要があります。プロファイラ(xdebug)を使用し、PHPのどこが遅いかを確認してください。大半の時間が、MySQLへの接続、またはMySQLが処理を行うのを待っているか、何か他のものである可能性があります。遅さが実際にあなたのアルゴリズムコードにある場合、オプションはあなたのアルゴリズムを変更します。これはあなたが望まないものです。または、処理能力をさらに上げてください。しかし、私は間違いなくそれがより多くの処理をスローすることを見て前に正確に遅さが最初にどこかを見つけるだろう。

1

ループ内にデータベースクエリがあります。あなたは一度すべての行を取得しようとし、メモリ内の結果をループしましたか? 1ページの読み込みで3500のクエリを作成している場合は、より高速になる可能性があります。

+0

これです。 Dijkstraのアルゴリズムは、すべてのノードのリラクゼーションに対してデータベースルックアップを必要とする場合よりも、メモリ内での実行がさらに速くなります。 –

関連する問題