<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ものぐさ備忘録 &#187; XML</title>
	<atom:link href="http://www.ginriki.net/wd/category/xml/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ginriki.net/wd</link>
	<description>ソフトウェア関係の話を中心とした備忘録的日記</description>
	<lastBuildDate>Sun, 11 Jul 2010 15:48:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>rexml vs libxml-ruby</title>
		<link>http://www.ginriki.net/wd/2008/11/15/47/</link>
		<comments>http://www.ginriki.net/wd/2008/11/15/47/#comments</comments>
		<pubDate>Sat, 15 Nov 2008 12:28:31 +0000</pubDate>
		<dc:creator>ginriki</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[libxml]]></category>
		<category><![CDATA[libxml-ruby]]></category>

		<guid isPermaLink="false">http://www.gikogeek.net/wd/?p=47</guid>
		<description><![CDATA[研究の関係で、37MBのXMLファイルに対して、XPathでデータを取り出したいという状況が起きました。
プロトタイプ実装として、Ruby標準ライブラリのrexmlでその処理プログラムを記述したのですが、
実行時にメモリ [...]]]></description>
			<content:encoded><![CDATA[<p>研究の関係で、37MBのXMLファイルに対して、XPathでデータを取り出したいという状況が起きました。</p>
<p>プロトタイプ実装として、Ruby標準ライブラリのrexmlでその処理プログラムを記述したのですが、<br />
実行時にメモリを700MB以上消費しやがります<sup>1</sup>。<br />
768MBしか積んでない私のマシンでは、メモリスワップが発生しまくりで実行が極端に重いため、<br />
別の手段を考えることにしました。</p>
<p>手段としては２通り思いつきます。</p>
<ol>
<li> メモリ使用効率の良いXMLライブラリを使う</li>
<li> SAX<sup>2</sup>を使う </li>
</ol>
<p>SAXで処理を実装するのはダルイので、今回は１番の手段にしました。</p>
<p>採用したXMLライブラリは、<a href="http://libxml.rubyforge.org/">libxml-ruby</a>っていう<a href="http://xmlsoft.org/">libxml</a>のRuby Bindingです。<br />
libxmlは、C言語で実装されたXMLライブラリで、libxml-rubyは、それをRubyで呼び出せるようにしたものです。</p>
<p>rexmlはRubyコードのみで実装されたXMLライブラリでして、libxml-rubyより実行速度が遅いです<sup>3</sup>。<br />
きっと、メモリ使用効率もlibxml-rubyの方がいいだろうと期待して、採用しました。</p>
<p>rexmlはRuby1.8では標準で入ってますが、libxml-rubyは自分でインストールする必要があります。<br />
インストールは、RubyGemsを使うと楽です。</p>
<p>私のCentOS 5環境下では以下の手順でインストールできました。</p>
<pre>
$ yum install libxml2-devel
$ yum install ruby-devel
$ gem install libxml-ruby
</pre>
<p>libxml-rubyを使って実装しなおしてみたところ、実行時の消費メモリは最大でも360MB程度になりました。<br />
これなら、私のマシンで普通に実行できます。</p>
<h4>XMLファイルサイズ、ライブラリ、メモリ消費量</h4>
<p>DOM操作にしろXPathにしろ、DOM Treeを作るのに一番メモリを消費すると<br />
思うんですが、実際、どの程度メモリを消費するのか気になったので、適当にググって見つけた<br />
リンクを貼っときます。</p>
<ul>
<li> <a href="http://tech.inhelsinki.nl/2007-08-29/">Javaの標準XMLライブラリの場合</a> </li>
<li> <a href="http://xmlsoft.org/xmlmem.html#General4"> libxml2の場合</a></li>
</ul>
<ol class="footnotes"><li id="footnote_0_47" class="footnote">途中で実行を中断したため、最大でメモリをどのくらい消費するかは不明</li><li id="footnote_1_47" class="footnote">Simple API for XMLの略</li><li id="footnote_2_47" class="footnote"><a href="http://libxml.rubyforge.org/">http://libxml.rubyforge.org/</a>参照</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.ginriki.net/wd/2008/11/15/47/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
