2010年4月29日木曜日

またもやXMLに翻弄される


xmlからmemcachedへデータを書き出すjavaプログラムをつくった。
xml parserとしてjava 1.6標準のStAXライブラリがあるが、
これが曲者であった。
巨大ファイルを扱ってもOutOfMemoryErrorにならないはずだが、
OutOfMemoryErrorに。
自分のコードをさんざん疑って時間を浪費したが、
なんとこれはライブラリのほうのバグであった・・・

xml parseで、apache xercesを使っている部分があるらしいのだが、
そこでchar[]にストリームをため込み続けてOutOfMemoryに至るよう。
memory analyzerのメッセージを読んだときは最初???だった。
ちなみにこれはjava 1.6 update 14で修正されたというアナウンスがあったらしいが、
直ってないらしい・・・

結局、海外サイトの掲示板で書かれていた方法で対処。
woodstoxという同じくStAXを扱うjava StAXからの拡張ライブラリがあり、
そちらを使用。
といってもコードを書き換える必要はなく、
classpathでライブラリのjarを含めるだけ。
これで、巨大XMLファイルでも、低ヒープメモリで扱えるようになった。

(apache xercesのほうのライブラリをclasspathに含めてもいけるかもしれない、が試していない)

0 件のコメント:

コメントを投稿