2012年8月27日月曜日

大量のデータを中期保存するために有効なシリアライズフォーマットを探してみる

非常に巨大なログファイルを保存しなければならないとして、
世間一般には、JSONでいいんじゃね?となりますが、いや実際小生もそう思ってましたが、

とある案件でのクローズドβでのログファイルサイズが、サーバ1台あたり2GBとかヤバいことになってしまいまして。クラウドにすればいいだろって?小生もそう思います。是非、我が顧客にそう説明してもらえませんか。もっとも1年前にしたらしいけどね。

pythonだったらpickleでいいんじゃね?となりますが、PHPだと



と牧歌的な意見がでるわでるわ。

小生も基本的には賛成なのですよ。しかし問題は、「中期保存」。中期って何時だって?仮に1週間としましょう。2GB×30台×1週間 とか、結構スゴイサイズなので、小さくしておいて損はないでしょう。第一、カッコワルイ。圧縮しろって?それもその通り。

取り急ぎ、いくつか見つけました。どれも試してないです。試した後に本稿を加筆する可能性アリ。

bencoder https://github.com/nrk/bencoder
bit-torrentの何かの形式らしい

msgpack https://github.com/msgpack
オフィシャルサイトによれば、かなり縮みそうです。コイツが本命かな。
http://msgpack.org/

> require "msgpack"       # gem install msgpack
> msg = [1,2,3].to_msgpack  #=> "\x93\x01\x02\x03"
> MessagePack.unpack(msg)   #=> [1,2,3]


BSON http://bsonspec.org/
我らが :) MongoDBの内部データ形式。故に pecl Mongoを入れると勝手に付いてきます。
https://github.com/MongoDB/mongo-php-driver