2011-01-29 54 views
0

我正在使用Freebase-Python模塊遍歷數百個結果。使用:如何減慢迭代生成器對象從Web服務中獲取數據?

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

我得到一個Python生成器,我可以像這樣遍歷:

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

mqlreaditer()獲取JSON在同一時間產生100。在100這一結果的一個條目是一個簡短的字符串,如:

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依賴關係和怪癖也適用。

+1

您能否包含完整的堆棧跟蹤以及觸發它的相關代碼?是否在freebase庫中引發異常?你有沒有檢查圖書館的來源,看看它爲什麼被提出? – 2011-01-30 23:38:46

回答

1

生成器只是一個看起來像一個序列的函數,但它一次只爲您檢索一個項目,而不是預先存儲整個數據列表,這通常需要更多的內存。如果你喜歡,這是一個「即時」迭代。但是,您無法保證它正在讀取或緩存多少數據。有時它可能已經有了整個數據 - 你只是不知道,沒有查看文檔或代碼。

如果確實是速度問題,那麼做import time並在循環內添加諸如time.sleep(1.0)的調用將會每次延遲一秒鐘:但我懷疑實際上並非問題所在,也不是什麼解決方案應該是。也許你的查詢是檢索太多的數據,或者對象太大?

+0

它以分段方式檢索數據,但每隔一段時間該分段過大並造成嚴重破壞。但我試着按照你的建議使用time.sleep,然後花時間清理memcache緩衝區(模塊保存響應的地方),並且工作正常!謝謝。 – 2011-01-29 17:38:27