忍者ブログ

podブログ

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

無題

wc -l [pod@mag1 linereadtest]$ time wc -l /data/14216.json 516318 /data/14216.json real 0m0.226s user 0m0.114s sys 0m0.107s
c++ [pod@mag1 linereadtest]$ time ./a.out 516318 real 0m0.345s user 0m0.215s sys 0m0.127s
perl [pod@mag1 linereadtest]$ time perl a.pl 516318 real 0m0.615s user 0m0.497s sys 0m0.117s php time php a.php /data/14216.ninja.json 516319 real 0m0.934s user 0m0.800s sys 0m0.126s jsonのデコードもしてみると php [pod@mag1 b]$ time php b.php /data/14216.ninja.json 516319 real    0m12.509s user    0m12.310s sys     0m0.130s http://sato-si.at.webry.info/200703/article_1.html 一番早く行を数えるのはどうすればいいだろう?言語の問題ではなくて、アルゴリズムやテクノロジー、ログの保存形式の問題のような気がしてきた。
  1. バイナリで保存する
  2. キャッシュの効くファイルシステムに保存する
  3. ファイルシステムの特徴
  4. mmapのようなシステムコールで処理
かな。他にもあるかもしれない。 バイナリであれば行を数えるのは簡単だ。自分の決めたロジックで指標となるインデックスをログに埋め込んでしまうのが早いだろう。データそのものではなくメタデータ専用のログ、つまり「行を数える」という専用のデータを埋め込むか、もしくはそれ専用のログにすればいい。 「1行に保存する」というのはとりあえず人間の目にわかりやすいように保存しておくという目的であって、後で集計のために高速に読み込むという目的ではないけ保存形式ってことだ。 そういうことで後で高速に集計するなら、最初から集計しやすいようにデータベースにINSERTする手法が考えられる。メリットとしては
  • データーベースの中では区切り文字は必要なく、数値はバイナリ保存されてこれ以上なく小さくなる
  • インデックス化されるため特定条件行を数えるのは速い
  • データーベースにもよるが、count(*)をインデックスから参照するものもある(mysql)ので行を数えるのはfgetsよりは相当速いはず
  • ログファイルそのものはバラバラにならないので管理がラク
  • ファイルの個数が相当少ないのでキャッシュは効きやすい
  • 複数のサーバーでデータや処理を分散化することが容易
逆にデメリットは?
  • データーベースの管理するファイルは大きくなるので、なるべくデータをキャッシュに乗せるためにはメモリが多く必要
  • (このデメリットはコスト面で不利に働くだろうが、昨今のメモリの価格下落からするとそんなにデメリットではない)

拍手[0回]

PR