2014-05-24 (土)
*[Android] FileChannel.mapでOut of memoryになって困る
Android(というかJava)で大きいファイルを扱うとき FileInputStream で読んでると遅いので,FileChannel.map()でmmapしたりするけど色々ハマりどころが多い.
複数ファイルを切り替えながらmmapしてるとすぐ「java.io.IOException: mmap failed: ENOMEM (Out of memory)」とか言われてしまう.
ヒープはほとんど使ってないので,単純にアドレス空間の制限に引っかかってるのだろうけど,ファイルを閉じてもMappedByteBufferがガベージコレクタに回収されるまでアドレス空間を専有し続ける.いまのところ,祈りながらSystem.gc()と書く以外の方法が見つからない...
ついでにByteBufferのpositionがintなのがすでに残念だし,ByteBufferの皮をかぶった何かを実装しようと思ったけど,ByteBufferメソッド多すぎて無かったことにした.Java使わずに書いたほうが良さげ.