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に含めてもいけるかもしれない、が試していない)

2010年4月25日日曜日

XMLDBに翻弄される…


MEDLINE(PubMed)の検索インデックスで使われているシソーラスデータでMeSH(Medical Subject Headings)というものがある。
1年毎の改訂で、最新版のダウンロードはフリー。
こいつがXMLファイルで提供されていて、
安易にXMLDBを使ってみようと思ったのは浅はかだった…

現在構想しているシステムのサブシステムで、MeSHデータの検索ができるようにしたい。
しかしXMLDBは時間がかかりすぎる。
eXistというものを意気揚々といれてハマった。
これはDOMでツリー構造を保存している?
MeSHのデータは300MB弱で、余裕でOutOfMemoryError。
(ひねくれてjavaヒープメモリを数Gbとか用意してやりたくなるが、諦めた)
IBMのDB2 Express-Cがフリーで使えるが、なんかめんどくさくなった(笑)
高速を謳っている他のXMLDBは金がないので手が出せない。
結局、今後の処理のことも考えて、memcache+MySQLみたいな感じにしとくか、と思い始めた。

なんか1日ちょっとで終わる予定の工程が1週間以上伸びてる;

2010年4月12日月曜日

Ninja

海外で、達人や専門家のことをNinjaと呼ぶ人たちがいるらしい。

しかしWorld of Warcraft(のみならずMMORPG)でも、
Ninjaという言葉がけっこう使われていることを思い出した。
簡単にいうとゲーム内で他のプレイヤーの同意なく、レアアイテムを勝手にかっぱらっていく人だ。
もっともゲームとはいえ社会性が破綻していると長く続けられないので
(MMORPGは一般にソロではたいしたことができんのです)
そういうことを繰り返すのはお子様が多いとは思うのだが。