JAVAとXMLとDOMとメモリ

手慰み的にXMLJAVAで操作するプログラムを書いてみた。操作手法はDOM。*1

とりあえずXMLの読み込みとかに成功していることを試した後、簡単なXSLTを使って変換するプログラムを書くと…エラーが出た。「java.lang.OutOfMemoryError」と言われる。

ミスを捜す…前にデータのファイルを切り詰めてみるとちゃんと通った。DOMはメモリを食う、とは聞いていたが。まぁ、変換するファイルが12Mあるのがいけないのか(笑)


VMの設定を変えると良いらしいが、変える方法がなかなか分かりにくい。

結局、テストはEclipseでやっていたので、EclipseJAVA->インストール済みのJREというところにデフォルトVM引数を入れるところがあった。*272Mでは失敗。96Mで成功。DOMに展開する過程でデータが何倍のサイズになっているのやら。(変換元と変換先の二つのDOMオブジェクトが必要と考えても3−4倍にはなっているのだろうか。)


このサイズでも既に手法はSAXなんだろうか、と思う。それとも100M程度で動くのならDOMでいい、ということなのか?というか言語をPerlにしておけと?


メモリを浮かすために「一度ルートエレメントの一つ下のものをNodeListとして取り出して…」と考えたが、XSLTでソートをしていたことを思い出した。(そもそも、JAVAでソートを書くよりXSLTでソートを書いた方が簡単そうだからそうしたのであった。)


検索して見つけた対処法では必ずXmsとXmxの両方のオプションを設定することになっているが、動かすためにはXmx(最大ヒープサイズの設定)のみでいけるようだ。どうやら見つけた対処法は基本的にサーバー用のもののようなので、「サービスの動作中にメモリの確保に失敗するのは危険」だから最初からメモリを確保するのだろうか。

*1:いつもはXSLTで操作しているが、条件分岐とかがめんどくさい。その点はプログラム言語を使った方が明快。

*2:「-Xms96m -Xmx96m」と入れる。当然、数字はVMのメモリ。