以下のログがあります。
---
日付 時分 A B C カウント
2006/8/3 11:00 1 4 8 84
2006/7/4 17:04 3 5 4 47
2006/8/4 13:30 1 4 6 32
2006/3/3 15:15 5 1 8 8
2006/5/8 18:20 3 3 3 43
・・・(以下、100万行位続く)・・・
---
このログを"時間"単位でA,B,C毎の"カウントを合計"したく、イメージとしては以下のテーブルを作りたいと思っています。(時間,A,B,Cの組み合わせでログに出て来なかったらテーブルに出力する必要無し。順番も特に問わない。)
---
日付 時間 A B C カウント合計
2006/8/3 11 1 4 8 84323
2006/8/5 13 4 8 3 9793
・・・・
---
処理スピードを重視して、メモリ上で行う前提で以下の方式を考えました。
多段配列を使い、ログが出るたびに
$count["2006/8/3"]["11"]["1"]["4"]["8"] = 7672
のような配列を作ります。もし、配列があるのならカウント部分を足し算します。
最後に配列全部をファイルに書き出すという方法です。
しかし、ログの量があまりにも多くやはり処理時間がかなりかかります。またプログラムも多段配列の表記にすると非常に見辛い状態です。何か別のアルゴリズムか手法により、スピード重視で処理する方法をご存知であればご教授ください。
前提がPHPを使わなければいけない&DB使えないという環境です。
よろしくお願いします。
No.3ベストアンサー
- 回答日時:
# 2です。
ちょっと気になって簡単なスクリプトで試験してみました。
一旦配列に格納し、それを集計、というものをfor,while,foreachでやってみました。
結果としては、forとwhileの差はほんの数パーセントで、ほとんど変わらなかったです。
概ねのベンチ結果は平均で for 2.82に対して、while 2.79です。
foreachでは $i<$cnt のような判断式が無いせいかずっと速かった(1.55)です。
配列を展開しながら繰り返す場合はforeachがベストなようです。
> かなりの時間は1時間程です。
冗談ならないですね。この手はcronで夜中にでもやらないとしょうがないですね。
ひょっとしたらPHPではなくC++やシェルを使ってプログラミングし、外部スクリプト(exec関数)で呼び出す、と言う方が速い可能性も高いですね。
また、1時間ということでしたら、ディスクアクセスの時間は十分小さくなるので、ディスクを使ってメモリをうまく解放させる方が速いかもしれません。
では。
ループ文の種類によって速度が違うということは非常に驚きです。
他言語を使ってという事も考えられるのですが、利用制限がありPHPしか使うことができないという苦しい状況なのです。
Try&Errorでなんとか比較しながらやってみたいと思います。コメントありがとうございました。
No.4
- 回答日時:
すごい!!
大変参考になります。配列に入れてforeachでループさせたほうがかなり早いのですね。
大変参考になりました。ありがとうございます。
No.2
- 回答日時:
100万行ですか、凄いですね(笑。
かなり時間がかかる、のかなりはどれくらいですか?
メモリ上で行なっていても、サーバの設定によってはメモリ上で行なわれなくなっている可能性もありますね。
php.iniの設定を変えてみて試験してみるのも一つの手かもしれません。
メモリで一杯になってしまっていた場合、ある程度のところでファイル書き出ししながらの方が速い可能性もあります。100万行ならば、桁数だけでも1メガな訳ですから、読込まれたデータだけでも相当なメモリを消費する可能性があります。1万行(あるいはもっと小さくても)ずつ処理した方が速いかも?しれません。
forよりはwhileの方が速い、と言う話もあります。
http://www.sound-uz.jp/php/test/first1.html
関数を使うより自作スクリプトの方が速い場合もあると思います。
サーバ環境、設定によって条件は左右されると思いますので、いくつか試してみて、最速の方法を見いだして下さい。出来れば、その結果を公開して下さい(笑。
参考まで。
コメントありがとうございます。
かなりの時間は1時間程です。早い感じもするのですが、もっと高速化を図りたいと思っています。
php.iniで使用メモリの設定もできるのですね。調べてみます。
forよりwhileの方が早い話、大変興味があります。話がそれますが、このような話好きなんですね。ちょっと研究して公開してみます。(笑
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アップロードファイルを表示す...
-
複数のパソコンの中の1つのパソ...
-
phpでcookieがうまく保存されない
-
1 OR 1=1 は どんな論理(約束事...
-
返信機能のツリー構造の深さを...
-
PHPについて。
-
phpのheader("Location:#pos")...
-
PHPからCSVをアップロード後、m...
-
[php初心者]サイトを見てデータ...
-
phpに関わる所での、form actio...
-
ゆゆにゃ。
-
【初心者】XAMPPのapacheの(恐...
-
プログラミング言語で、使える...
-
こちらはただの直列処理ですか?
-
PHPでこのコード自体に意味は無...
-
PHPとHTML+Xamppの掲示板で画像...
-
phpでPEAR::DBを使っているので...
-
index.phpって何ですか? 具体...
-
index.phpに入るには、どうすれ...
-
awsにApacheとPHPを入れて、何...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列をループでたくさん宣言し...
-
$_SESSIONに二次元配列を使える...
-
String だと「 ByRef引数の型が...
-
foreachのなかで次のキーを参照...
-
file_existsでファイル名の部分...
-
PHPのカッコ[ ]の使い方について
-
postgresql関数をつかったレコ...
-
multiple属性のPOSTを配列で受...
-
PHPとMySQLの高速化
-
Smartyのテンプレートからjavas...
-
漢字のソートについて
-
配列一致(要素順番は違うが内容...
-
PHPで配列をPOSTデータで送った...
-
PHP 配列の添字に変数は使えない?
-
ネストが深い時のforeachはどう...
-
PHP 多次元配列変数のデータ受...
-
テキストの処理について
-
smartyで配列の中の同数値の数...
-
レンタルサーバでMYSQLに...
-
配列を回すとき、最後の要素だ...
おすすめ情報