1

管理している Web サイトのLAMPスタックを使用しています。使用統計 (デスクトップ製品に関連するさまざまなもの) をまとめる必要があります。

私は最初、PHP でこの問題に取り組みました (既にデータを操作するためのクラスがたくさんあるためです)。5.3を使用していた私の開発ボックスではすべてうまくいきました。

簡単に言うと、5.1 のメモリ管理はかなりひどいようで、長期ロールアップ スクリプトを固定メモリ空間で実行するために、多くのばかげたことをしなければなりませんでした。私たちのサーバー担当者は、現時点では PHP をアップグレードするつもりはありません。その後、開発サーバーを 5.1 に戻したので、この問題に再び遭遇することはありません。

MySQL データベースのマイニングでさまざまな期間と解像度の統計をロールアップし、(cron スケジュールではなく) 将来にわたって常にこれを実行するプロセスを実行する可能性がある場合、どの言語を選択することをお勧めしますか? 私は Python (多かれ少なかれ知っている)、Java (あまりよく知らない)、または PHP (かなりよく知っている) でそれを突き出していました。


編集:コメンターのデザインの明確化

解決策: ロールアップ スクリプトが現在機能する方法は、解決策とバケットを定義するためのクラスがいくつかあることです。私は年、月、週、日を持っています - 「バケット番号」が与えられると、各クラスはそのバケットの時間範囲を定義する開始と終了のタイムスタンプを与えます - これは任意のエポック日付に基づいています。システムは「完全な」記録を維持します。つまり、現在、最後に実行されてから各解像度のロールアップされたデータセットを完成させます。

SQL Strat: 基本統計は、多くの異なるスキーマとテーブルにあります。ほとんどの場合、ロールアップされた統計ごとに個別のクエリを実行してから、挿入用に 1 つのレコードを入力します。次のようなネストされたサブクエリを提案しています。

roll_up_stats (someval、someval、someval、...) に INSERT (someschema から SUM(somestat) を選択、someschema2 から AVG(somestat2) を選択)

これらのサブクエリは一時テーブルを生成しますよね? 私の経験では、過去に糖蜜のように遅かったです。それはより良いアプローチですか?

編集 2: 質問にいくつかのインライン応答を追加する

5.1 php の場合、言語がボトルネックでした -- 基本的に、言語の選択が間違っていると言われました (スクリプトは 5.3 では問題なく動作しましたが)。あなたは、私がこのタスクのためにチェックアウトしているpythonについて言及しています。明確にするために、私がやっていることは、デスクトップ製品の使用統計の管理ツールを提供することです (ログは実際には EJB サーバーによって mysql テーブルに書き込まれます)。私は apache ログ ファイルの分析と、Web 側でより多くのカスタム Web レポートを行っていますが、このプロジェクトは別です。私がこれまでに取ったアプローチは集計テーブルです。これらのメッセージ キュー製品で何ができるかわかりませんが、調べてみます。

さらに言えば、データは、サービスおよび顧客レベルで経時的なアクティビティをグラフ化するために使用され、管理者が製品がどのように使用されているかを理解できるようにします。期間 (4 月 1 日から 4 月 10 日まで) を選択し、選択した期間に応じて、特定の機能の合計使用時間 (時間、日、月など) のグラフを取得できます。その本質的には、使用状況の事後分析です。ただし、必要性はリアルタイムに向かっているようです (最後の 1 時間の使用状況を見てください)。

4

3 に答える 3

1

私は過去に同じようなことをするプロジェクトに取り組んだことがあるので、実際にパフォーマンスを経験しています。「INSERT...SELECT」(「INSERT ... VALUES(SELECT ...)」ではありません)のパフォーマンスに勝るものはありません。http://dev.mysql.com/doc/refman/5.1を参照してください。 /en/insert-select.html

利点は、これを行う場合、特にMySQLプロシージャでロールアップコードを保持する場合、外部から必要なのは、DBを突き刺して適切なロールアップを適切に実行するためのcronジョブだけであるということです。回-シェルスクリプトのように単純な' mysql <correct DB arguments etc.> "CALL RollupProcedure"'

このようにして、メモリ割り当てのバグがゼロになることを保証し、MySQL DBが別のマシン上にあるときに適切なパフォーマンスを発揮します(マシンの境界を越えてデータを移動することはありません...)

編集:1時間ごとの解像度は問題ありません-1時間ごとのcronジョブを実行するだけです...

于 2010-04-15T19:04:53.363 に答える
1

この問題にはさまざまなアプローチがあり、そのうちのいくつかはここで言及されていますが、ロールアップ後のデータで何をしているのかは不明です...?

このデータを利用して、サイトに Digg のような「X Diggs」ボタンを表示したり、要約グラフなど、何らかの形で継続的に利用できるようにする必要がある場合は、memcache を実際に利用して、コードは、特定の統計のキャッシュ キーを適切なタイミングでインクリメントして最新の状態に保ちます。

データベースに集計テーブルを保持することもできます。これは、より複雑なレポートに適しています。この場合、持っているデータの量とニーズによっては、時間別のテーブルを用意して、そのベース テーブルに基づいてビューを作成し、日、週などを表すだけで済む場合があります。

大量のデータがあり、集約テーブルが必要な場合は、RabbitMQ や ActiveMQ などのキューへの統計収集 (およびおそらくデータベース クエリ自体) のオフロードを検討する必要があります。キューの反対側には、必要に応じてデータベース (およびおそらくキャッシュ) 内のものを更新しながら、常に待機して実行するコンシューマー デーモンを配置します。

考慮すべきことの 1 つは、Web サーバーのログです。config のログ形式ルールを微調整しただけで、必要な統計のかなり大きな部分を Web サーバー ログ自体から取得できた例を見てきました。ごとにログをローリングし、オフラインで処理を開始して、結果をレポート データベースに記録できます。

私はこれらすべてを Python で実行しました (具体的には、Apache 結合形式のログを処理するためにloghettiをリリースしました) が、言語が制限要因やボトルネックになるとは思いません。Ruby、Perl、Java、Scala、または awk (場合によっては) も機能します。

于 2010-04-15T23:55:24.263 に答える
0

主に SQL コマンドを実行している場合、コマンド ラインで MySQL などを使用しないのはなぜですか? 集計データをリストする単純なテーブルを作成mysql -u[user] -p[pass] < commands.sqlし、ファイルから SQL を渡すようなコマンドを実行できます。

または、作業を小さなチャンクに分割し、それらを順次実行します (それが最も簡単な場合は PHP ファイルとして)。

継続的な長時間実行プロセスが本当に必要な場合は、ループを作成して無期限に実行し続けることができるため、python や java などのプログラミング言語の方が適しています。PHPはそのようなことには適していません。PHP クラスを Java に変換するのは非常に簡単です。

于 2010-04-15T18:41:51.133 に答える