Google App Engine と Senその後(2)

Google App Engine上で形態素解析Senを使う試み.ようやくうまく行った.メモリが足りないせいじゃないか,というのは私の間違いで,メモリの問題ではなかった.問題をまとめておこう.

App Engineの特性

  • アップロードできるファイルは1つ10Mバイトまで. 10Mバイト以下ならいくつあっても大丈夫のようだが,一つは10Mバイト以下でなければならない.
  • java.nio.MappedByteBuffer が使えない.これはファイルをmmapするAPI.なんで使えないのかよくわからないのだが,とにかく使わせてくれない.
  • 30秒のカべ.リクエストの処理は30秒以内で終わらないと行けない.

Senの側の問題

  • StringTaggerなどの,XMLによる設定ファイルsen.xmlを読む部分で,InputSourceにファイル名をそのまま渡している.ここは,絶対パスにしておかないといけないので,Fileを作って,absolute pathを渡すようにしなければいけない.
  • FileAccessorの抽象の不備.辞書ファイル群の読み出しはFileAccessorというインターフェイスで抽象化されているのだが,辞書ファイルの長さを参照するインターフェイスが切られていなくて,TokenizerクラスのloadConnectCostでは,File.length()で参照してしまっている.このため,ファイルを分割するようなFileAccessorが書けない.

解決策

Senの問題にはとりあえずパッチを当てた.辞書ファイルが10Mを超えるという問題に関しては,圧縮するという手も試してみたが,圧縮したファイルをメモリ上に展開するのに時間がかかり,GAE上で,30秒以内で終了してくれなかったので断念.非圧縮のまま複数に分割することにした.分割に対応したFileAccessorを実装した.

当てたパッチなどは今後本家にフィードバックしたいものだが,このプロジェクト生きてるのかな...

できあがったものをここ にアップロードしてみた.