-1

私はPythonで書かれたGAEプロジェクトを持っています。私はバッチ操作を実行するためにcronを作った。しかし、F1インスタンスのソフト・プライベート・メモリー制限に達しました。これは数回の反復後に124MBです。誰も私がこのコードをより効率的に書いてくれるのを助けてくれるでしょうか、うまくいけば124MB以内です。 len(人)は500未満である必要があります。Python Google App Engineプロジェクトでメモリリークが発生しました。私の操作を書くための効率的な方法はありますか?

def cron(): 
    q = Account.all().filter('role =', 1) 
    people = [e for e in q] 
    for p in people: 
     s = Schedule.available(p) 
     m = ScheduleMapper(s).as_dict() 
     memcache.set('key_for_%s' % p.key(), m) 

これはdevサーバーです。インスタンスクラスをアップグレードしたくありません。さらに、numpyやpandasなどのサードパーティのライブラリを使用しないようにしたいと思います。

forループの最後の行にガベージコレクションを追加しました。しかし、それは動作していないようです。

del s 
m.clear() 
import gc 
gc.collect() 
+0

あなたは何個のエンティティを取得しているかについて言及していません。また、私はループを関数とgcの外側に移動します。あなたが反復を言うときは、cronハンドラまたは外側または内側ループの呼び出しを意味しますか? –

+0

コメントありがとうございます!エンティティの数は500未満でなければなりません。反復については、私は内部ループを意味しました。 – steve

+0

内部ループの数。あなたのモデルを見ることなく、私はあなたのどこかの参考文献を保持していると思われます。 –

答えて

0

それはあなたがその1つのエンティティに成功しforループを実行できる場合は、単一のエンティティを取得し、確認するようにクエリを変更したいメモリフットプリントにそれに合うようにしても可能ですかどうかを確認します。それはあなたに動作しない場合、または単にforループ:)

の最後にbreakを追加必要性をにあなたのインスタンスクラスをアップグレードします。

実験がうまくいく場合は、Query Cursorsを使用して複数のpush queueタスクに分割することができます。各タスクは1つのエンティティのみを処理します。

複数のタスクで作業を分割する方法については、Google appengine: Task queue performanceを参照してください(この場合の分割の理由はメモリの制限ではありません)。

複数のタスクを使用する場合でも、メモリ制限(App Engine Deferred: Tracking Down Memory Leaksを参照)を実行することは可能ですが、特定のインスタンスが再起動されても(少なくともタスクはデフォルトで再試行されます。

関連する問題