質問

私はAにいます ランプ 私が管理しているウェブサイトのスタック。使用法統計(デスクトップ製品に関連するさまざまなもの)をロールアップする必要があります。

私は最初、PHPで問題に取り組んだ(すでにデータを扱うためにたくさんのクラスがあったからです)。 5.3を使用していた私の開発ボックスですべてがうまく機能しました。

長い話を短くすると、5.1メモリ管理はさらに悪化しているようで、固定メモリスペースで実行するために長期的なロールアップスクリプトを取得するために多くのだまされなければなりませんでした。私たちのサーバーの人たちは、現時点でPHPをアップグレードすることを望んでいません。それ以来、DEVサーバーを5.1に戻したので、再びこの問題に遭遇しません。

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


編集:コメンターのための明確化を設計します

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

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

lolled_up_stats(someval、someval、someval、...)値に挿入(SomeschemaからSelect Sum(Somestat)、Select avg(Somestat2)from someschema2)

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

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

言語は5.1 PHPの場合のボトルネックでした - 私は本質的に間違った言語の選択をしたと言われました(ただし、スクリプトは5.3で正常に機能しました)。あなたは私がこのタスクをチェックしているPythonについて言及します。明確にするために、私がしていることは、デスクトップ製品の使用統計の管理ツールを提供することです(ログは実際にはEJBサーバーによってMySQLテーブルに記述されます)。 Apacheログファイル分析と、Web側でのより多くのカスタムWebレポートを行いますが、このプロジェクトは別々です。私がこれまでに行ったアプローチは、集計テーブルです。これらのメッセージキュー製品が私のために何ができるかはわかりません。見てみましょう。

もう少し進むために、データはサービスと顧客レベルでの時間の経過とともにアクティビティをチャートするために使用され、経営陣が製品の使用方法を理解できるようにします。期間(4月1日から4月10日)を選択し、選択した期間に応じて、異なる粒度(時間、日、月など)で特定の機能の合計分数の使用数分のグラフを取得できます。その本質的には、使用後の分析です。ただし、必要性はリアルタイムに向かっているようです(使用の最後の1時間を見てください)

役に立ちましたか?

解決

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

このデータを利用して、サイトにDiggのような「x diggs」ボタンを提供したり、何らかの継続的に利用できるようにする必要があるグラフまたはそのようなものを提供したい場合は、実際にMemcacheを利用して、コードは、適切な時間にインクリメントすることにより、特定の統計のキャッシュキーを最新の状態に保ちます。

また、データベースに集約テーブルを保持することもできます。これは、より複雑なレポートに適している可能性があります。この場合、あなたが持っているデータの量とあなたのニーズが何であるかに応じて、あなたは1時間ごとのテーブルを持っていることで逃げることができるかもしれません、そして、そのベーステーブルに基づいて日、週、その他を表すためにビューを作成するだけです。

大量のデータがあり、集計テーブルが必要な場合は、rabbitmqやActivemqなどのキューに統計コレクション(およびおそらくデータベース自体)をオフロードすることを調べる必要があります。キューの反対側には、常に座って実行する消費者デーモンを置き、必要に応じてデータベース(およびおそらくキャッシュ)で物事を更新します。

あなたが考慮するかもしれないことの1つは、あなたのWebサーバーのログです。 Webサーバーから必要な統計のやや大部分を取得できたインスタンスは、構成のログ形式ルールをわずかに微調整した後に自らを記録しました。ログを毎回ロールしてからオフラインで処理して、レポートデータベースに結果を記録できます。

私はこれらすべてをPythonでやった(私はリリースした ロゲッティ Apacheの組み合わせ形式ログを具体的に扱うために)、言語はここでは制限要因やボトルネックであるとは思いません。 Ruby、Perl、Java、Scala、さらにはawk(場合によっては)が機能します。

他のヒント

私は過去に同様のことをするプロジェクトに取り組んできたので、パフォーマンスに関する実際の経験があります。 「挿入... select」のパフォーマンスを打ち負かすのは難しいでしょう(「insert ... select ...)」のパフォーマンス(挿入... select ...)。 http://dev.mysql.com/doc/refman/5.1/en/insert-select.html

利点は、特にMySQL手順でロールアップコードを保持している場合、外側から必要なのは、DBを突き出して右側の右のロールアップを実行するための単なるCRON-JOBであるということです。時代 - シェルスクリプトのようにシンプルな 'mysql <correct DB arguments etc.> "CALL RollupProcedure"'

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

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top