2011-01-29 28 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