0

Freebase-Python モジュールを使用して、何百もの結果を繰り返し処理しています。使用:

results = freebase.mqlreaditer(query, extended=True) 

次のように反復処理できる Python ジェネレーターを取得します。

for r in results:
   #do stuff, like create new object and save to datastore

mqlreaditer() は一度に 100 個の JSON 結果をフェッチします。100 という結果の 1 つのエントリは、次のような短い文字列です。

result:: {u'type': u'/games/game', u'mid': u'/m/0dgf58f', u'key': 
          {u'namespace': u'/user/pak21/', u'value': u'42617'}}

ローカルでエラーが発生しています:

"WARNING  2011-01-29 15:59:48,383 recording.py:365] 
 Full proto too large to save, cleared variables."

何が起こっているのかわかりませんが、速すぎると思われるので、反復を遅くするか、チャンクに分割したいと思います。ジェネレーターがどのように機能するか、またはオプションが何であるかがわかりません。これは Google App Engine で実行されているため、Python の依存関係と、ローカルのアプリ エンジン ランチャーを使用する際の癖が適用されることに注意してください。

4

1 に答える 1

1

ジェネレーターは、シーケンスのように見える単なる関数ですが、多くの場合、より多くのメモリを必要とするデータのリスト全体を事前に取得する代わりに、アイテムを一度に 1 つずつ取得します。必要に応じて、これは「ジャストインタイム」のイテラブルです。ただし、それを行うために読み取ったりキャッシュしたりするデータの量に関する保証はありません。場合によっては、データ全体が既に存在している可能性があります。ドキュメントやコードを見ないとわかりません。

それが本当に速度の問題である場合、ループ内import timeなどで呼び出しを実行して追加するとtime.sleep(1.0)、毎回 1 秒ずつ遅延します。クエリが取得するデータが多すぎるか、オブジェクトが大きすぎる可能性があります。

于 2011-01-29T16:29:41.803 に答える