RandomAccessFile を使い過ぎました...

ファイルを読み込んで、それをパースして、単語を切り出して... みたいにやってたら、あっさりOutOfMemory でJavaVMがお亡くなりになりました。まぁ、OutOfMemoryはほぼ予想していたので、次は、幾つかファイルに情報を保存するようにしてテストコードを書いてみた(かなーりスパゲティコードになってしまったのだが)。

そこで RandomAccessFile を積極的に(笑)、使ってみた。テストだから、ファイルに保存してOutOfMemoryを出さないことと、動かすことを第一目標にした。そして、がんがん 読み出し/書き出し、しかも 数バイト単位で。すると、どうしたことだろう、速度が...。というか、プログラムがさっぱり終わる気配がなくなりました ... orz. 結局、ちょっとしたことをやるのに、1時間以上かかるようなプログラムできちゃった。あたりまえだけど、FileSystemアクセスは、やるなら、がつんとブロックでアクセスしねーと、ひでーめに合うことを体感しました。

このままじゃ、テストにならないので、ちょっとづつ改善していくと、見る見るうちに改善されていく。1時間以上かかってたプログラムが、約7分で完了。コマンドラインで動くので、JDKについている、プロファイラをつかって進める。

eclipse だと実行したいクラスの個所で右クリック。->「実行」->「実行...」->「引き数」->「VM引き数」 とかで、次のような設定を入れればいい。

-Xrunhprof:cpu=samples,file=hprof.samples.txt,depth=10

これは、パフォーマンス(CPU時間)だけど、メモリなどの場合は、Xrunhprof:heap とかに変えたりすれば良い。この辺の細かいところは、APIの説明を読めばだいたい解かる。

これで、時間を占有している個所から改善して行けばいいはずだし、今回はそれで改善された。まだまだ、チューニング個所があるけど、スパゲティーコードをなんとかしないと、1週間で読めなくなりそう。もうちょっと確認事項を確かめて、直すことにしよう。