JAVAとXMLとDOMとメモリ
手慰み的にXMLをJAVAで操作するプログラムを書いてみた。操作手法はDOM。*1
とりあえずXMLの読み込みとかに成功していることを試した後、簡単なXSLTを使って変換するプログラムを書くと…エラーが出た。「java.lang.OutOfMemoryError」と言われる。
ミスを捜す…前にデータのファイルを切り詰めてみるとちゃんと通った。DOMはメモリを食う、とは聞いていたが。まぁ、変換するファイルが12Mあるのがいけないのか(笑)
VMの設定を変えると良いらしいが、変える方法がなかなか分かりにくい。
結局、テストはEclipseでやっていたので、EclipseのJAVA->インストール済みのJREというところにデフォルトVM引数を入れるところがあった。*272Mでは失敗。96Mで成功。DOMに展開する過程でデータが何倍のサイズになっているのやら。(変換元と変換先の二つのDOMオブジェクトが必要と考えても3−4倍にはなっているのだろうか。)
このサイズでも既に手法はSAXなんだろうか、と思う。それとも100M程度で動くのならDOMでいい、ということなのか?というか言語をPerlにしておけと?
メモリを浮かすために「一度ルートエレメントの一つ下のものをNodeListとして取り出して…」と考えたが、XSLTでソートをしていたことを思い出した。(そもそも、JAVAでソートを書くよりXSLTでソートを書いた方が簡単そうだからそうしたのであった。)
検索して見つけた対処法では必ずXmsとXmxの両方のオプションを設定することになっているが、動かすためにはXmx(最大ヒープサイズの設定)のみでいけるようだ。どうやら見つけた対処法は基本的にサーバー用のもののようなので、「サービスの動作中にメモリの確保に失敗するのは危険」だから最初からメモリを確保するのだろうか。