2010年11月28日日曜日

Google App Engineでメモリを節約する

igo-pythonがGAEでもやっと動くようになったと思ったら、メモリの使いすぎで毎回インスタンスが終了されてしまう状態でした。メモリ使用量を削減したものをリリースしました(最初に出したのはバグってた。やっぱり文字と文字コードの扱いだった。@norioさんありがとうございます)

辞書の読み込みが問題(*)であることは見当がついていたので、幾つか思い当たる点をあたってみた。
  1. 文字列の連結で全部ロードしてからjoinするのをやめた
    • 少し減ったがほとんど効果なし
  2. バイト列で読んでからunicode化するのをStreamReaderで直にunicodeで読むようにした
    • 思ったより減らない
  3. Unicode文字列を使うのやめてarrayを使うようにした
    • 効果大
GAEのPythonはUCS4モードになっているので、大きいunicode文字列を持つとメモリの使用量が思った以上に増えてしまうことが分かった。それを連結したりしていたため最終的な文字列が出来ときに許容量をオーバーしていたと考えられる。
また、同じくメモリ節約のためarray.fromstringではなく、array.fromfileで読みたいため、いったんmmapは使わないようにした。pythonのmmapはコピーを作ってしまうので全部シーケンシャルに読んでしまうような使い方ではあまり効果がなさそうと判断した。

(*) 読み込みが終わっている状態では70MB程度で何度もインスタンスを作ったり、parseしても特に増えていく様子はなかった。

0 件のコメント:

コメントを投稿