QA@IT

Rubyで大容量XMLをスマートに読む方法

3386 PV

Ruby初心者です。

Rubyを使って、約1GBほどのXMLのデータをスマートに読む方法を探しています。具体的には、XMLのデータを MySQL サーバに流し込みを行いたいです。

今まで試した方法

  • REXML : メモリが明らかに足らない。
  • LibXML : メモリを沢山積んだサーバであれば動くが、それでもメモリを食い過ぎる。
  • REXML::StreamListener : そのまま使うにはちょっと、スマートじゃない。

現状

今現在は REXML::StreamListener を使用した独自のモジュールを開発し、対応をしています。実装内容としては、特定のタグの間の情報をハッシュ化し、イテレータにその値を渡す。といった形です。

とはいっても、初心者なので自分自身が使う上で必要最低限の機能しか実装出来ていなく、不完全なモジュールです。

質問

他のライブラリや、その他の方法でのスマートなやり方があれば教えて頂きたいです。

また、REXML::StreamListener をベースとした、モジュールなどを探してみましたが、見つけることができませんでした。REXML::StreamListenerは、そのまま使うのにはあまり適していないと思うので、あってもいいと思ったのですが…。もしご存知でしたら教えて下さい。

回答

メモリに乗り切らない以上、DOM パーサではなく SAX パーサを使う他ないでしょうね。libxml をラップした nokogiri というライブラリがありまして、これは SAX パーサを提供しています。pure ruby の REXML よりは速くてメモリを喰わないと思います (推測)。

「そのまま使うにはちょっと、スマートじゃない」が解決できているか自信がないのですけれど…。

編集 履歴 (0)
  • SAXパーサは、 REXML::StreamListener の nokogiri版というイメージでしょうか。簡単に確認しただけなので、厳密には違うかもしれないですが、REXML::StreamListenerと使い方としてはSAXパーサとほぼ同じ様です。SAXをラップしたような物がアレばいいかもしれないですね。ありがとうございます。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。