実験的なブロブストアファイルAPIを使用して、いくつかのイベントデータを含むCSVファイルを書き出しています。たくさんのデータがあるので、私は書き込みをバッチ処理しています。私のコードはバックエンドで実行されているので、時間がたくさんありますが、メモリが不足しています。理由はわかりません。大きなファイルをブロブストアに書き込んでメモリ不足になる
ここでは、コードです:
from __future__ import with_statement
from google.appengine.api import files
q = Event.all()
events = q.fetch(50)
while events:
with files.open(blobname, 'a') as f:
buf = StringIO()
for event in events:
buf.write(event.id)
buf.write(',')
buf.write(`event.logged`)
buf.write(',')
buf.write(event.type)
buf.write(',')
buf.write(event.timestamp)
buf.write(',')
needAmpersand = False
for prop in event.dynamic_properties():
if needAmpersand:
buf.write('&')
needAmpersand = True
buf.write(prop + '=' + str(getattr(event, prop)))
buf.write('\n')
f.write(buf.getvalue())
buf.close()
events = q.fetch(50)
files.finalize(blobname)
プロセスは、以上のメモリ140メガバイトを使用したアボートする前に、このコードはしばらくイベントループの周りを約20倍にそれを作るには。イベントは、このアプリケーション固有のデータベースモデルです。イベントは基本的にリモートマシン上で起こっていることの記録ですが、後でこれらのイベントはmap reduce操作によって処理され、統計情報を構築します。今はただダウンロードしたいだけです。私たちのデータベースには1000種類のイベントが100種類あります(後でそれを別々に保存することに変わりますが、今のところこれがそれです)。それぞれの私はf.open
原因f.close
とf.close()
がちょうどf.write(..)と呼ばれるこのコードの以前のインスタンス化f.__exit__()
によって呼び出された通りに、句で終了するたびに呼び出されることに注意し
要素は 'StringIO'に書き込まれます。この以前のバージョンでは、メモリが不足していましたが、それ以外は同様に動作しました。このコードにはメモリをリークさせる何かが残っています。
ヘルプ?
更新 は、私はちょうど(buf.getvalue())f.writeをコメントアウトしようとしました、それは明らかにそれには何もしてブロブストアアイテムを作成しませんが、それがすべて処理された最終的に完了しませんイベントエンティティ。私は何かを見逃しているか、またはf.write()リークメモリかfinalize()まですべてをバッファリングしますか?
「イベント」とは何ですか? AppEngineオブジェクトですか? –
「元のバージョン」は何をしましたか?それが何をしたのかわからなくても、「早急に解決する」ことを知ることは役に立ちません。 –
ありがとうございます。私はより明確な情報を提供するために質問を編集しました。 – Jules