小さなオブジェクトの大規模なセット (いくつかの短い文字列とブール プロパティのみを持つ 15k オブジェクト) に対してクエリを実行すると、これらのオブジェクトに対して何もせずに、インスタンスのメモリ使用量が継続的に増加します (70Mb 増加)。メモリの増加は、クエリのためだけにメモリに保持する必要があるデータの量に比例しているようには見えません。
私が使用するループは次のとおりです。
cursor = None
while True:
query = MyModel.all()
if cursor:
query.with_cursor(cursor)
fetched = 0
for result in query.run(batch_size = 500):
fetched += 1
# Do something with 'result' here. Actually leaving it empty for
# testing to be sure I don't retain anything myself
if fetched == 500:
cursor = query.cursor()
break
else:
break
これが appstats によるものではないことを確認するためにappstats.recording.dont_record()
、統計を記録しないように呼び出します。
何が起こっているのか、誰にも手がかりがありますか? または、これをデバッグ/プロファイルする方法に関する指針はありますか?
更新 1 :gc.set_debug(gc.DEBUG_STATS)
プロダクション コードを有効にしましたが、ガベージ コレクターが定期的に呼び出されているので、ガベージを収集しようとしています。gc.collect()
ループの最後 (リクエストの最後でもあります) でa を呼び出すと、 ; を返し0
、役に立ちません。
更新 2 : guppy を dev_appserver で動作させるためにいくつかのハッキングを行いましたが、これはgc.collect()
、ループの最後の明示的な後、ほとんどのメモリが「google.appengine.datastore.entity_pb の辞書」によって消費されたことを示しているようです。 。財産'。