プログラミング 美徳の不幸

Ruby, Rails, JavaScriptなどのプログラミングまとめ、解説、備忘録。

パーサーを書く

最近仕事でもプライベートでもパーサーを書いてる。パーサーというか、クロールした生htmlをこちらの使いたいようなフォーマットにするために正規表現とかDOMの比較とか、そういうやつ。

で、当初こういう構成でクラスを作っていた。

worker(非同期) => processor(いわゆるcontroller的な) => parser(htmlを処理して使いやすい文字列にし直すだけ)

parserの結果をprocessorが受け取って永続化するとか、他に辿れるリンクがあるかとかを管理する。で、最後に辿れるリンクがある場合はその分だけさらにworkerを立ち上げる。(これはworkerが管理する)

まぁこの構成は悪く無いと思うが、当初processorで永続化にmysqlを使っていた。これが辛かった。というのは説明すると長くなるので省くけど、一言でいえばサイトからデータをぶっこぬきたいときに見た目のページを探索していって正規化されたデータベースをつくりあげようと思うとprocessorの処理が非常にヘビーになるためである。
あるURLをひとつのprocessorが処理したら、確実に1ドキュメントを保存するかできないかのどちらかでprocessorの処理を終了して次のworkerに行きたいわけです。

で、まぁなんとなく勘のいい方はわかったと思いますが、その結果ドキュメント志向のMongoDBを使ってみた。これがすごく合ってる。まぁどこらへんがすごく良いか、それはぶっちゃけた話クロール対象のwebページからjson APIを作成するという意味でわざわざRDB<=> JSONという相互の実装を書く必要がない点が非常に良いのだが、意外にもRailsで使う場合ActiveRecord的な知識が使える(※)ようにうまくなっている点とか。

だんだん時代はMongoDBじゃないかという気がしてきている。



※・・・メジャーなgemであるmongoidを使用するとActiveRecordシンタックスに非常に近い形でmongodbの検索等ができる上、極力ActiveModel等の非ミドルウェア依存ライブラリがincludeされている。つまりvalidationやenumerize等のライブラリがそのまま使える。(これはライブラリ側の対応状況にもよる)