これはマイネット Advent Calendar 5日目の記事です
##前提の話
弊社ではソーシャルゲームの運営を行っています。
お客様からの問い合わせ対応も重要な業務の一つなのですが、そこで必要となるのが「DB内のプレイヤーデータ」と「ユーザ行動ログ」です。
なのですが、私が担当しているアプリではログが「Python2系の標準出力がそのまま吐き出される」というかなりおおざっぱな方法で蓄積されています。(もちろん整形はされていますが、型情報が失われていたり、文字列がu'hogehoge'
となっていたりと、かなりな状況です。)
せっかくのログ、宝の山なのですから、もっと検索しやすいようにしなければなりません。そこで、まず手始めにデータをダンプしてみることにしました。
処理にはRuby バージョン2.2.1を使用します。
元のアプリはPython2.7なのですが、アプリの一部では無いことと、自分の手になじんでいるのがRubyなのとで、Rubyを選択しています。
##現在の状況と、やりたいこと
1行が1つのログで、1日分が1ファイルとして蓄積されています。
1ファイルのサイズは1.3GB強。ログの件数は460万件ほどとなっています。
これを何らかの方法でオブジェクト化してダンプするのですが、オブジェクトはみんな大好き連想配列にしました。RubyではHashですね。
当然、まとめてダンプするのではメモリがいくらあっても足らないので、1行ずつ処理してファイルに書き出していく形式を取ります。
せっかくなので複数の型式で処理時間を計測してみたいと思います。
- みんな大好きJson
- 余り使われてない気がするMessagePack
- 設定ファイルだよね? YAML
YAMLはほぼ冗談に近いとしても、テキスト形式のJSONとバイナリ形式のMessagePackではどのくらい差が出るのか気になるところです。
##計測実行
JSONの場合
実行時間 1393.9935074109817(だいたい23分)
ファイルサイズ 1.61GB
MessagePackの場合
実行時間 1267.4577710159938(だいたい21分)
ファイルサイズ 1.39GB
YAMLの場合
実行時間 4739.792451704008(だいたい79分)
ファイルサイズ 1.62GB
と言う結果になりました。
JSONとMessagePackでは1件あたりの処理時間にそこまで大きな差は無さそうですが、ファイルサイズではかなり大きな差が生まれました。
JSONとYAMLの間にそこまで差が無いことを考えると、テキストとバイナリの差かな、と思われます。
一方で、YAMLの処理時間の遅さが際立っていますね。
3倍〜4倍の処理時間がかかることを考えると、大規模なデータに対しては使いづらいといえます。やはりYAMLは可読性の良さをいかして設定ファイルに使う方が良さそうです。
##今後の課題
ログファイルをそのままダンプしたところで、処理時間がかかるだけでほとんど意味がないので、実用のためには検索を挟んでやる必要があります。
ただ、.select.select.select…
と言うようなメソッドチェインはあまりやりたくないものです。
幸い、Rubyは内部DSLを作りやすい言語でもありますので、その辺をうまく吸収してくれるDSLを書かなければならない、と思っています。
後編へ続く か…?