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 结果中的一个条目是一个短字符串,例如:

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

生成器只是一个看起来像序列的函数,但它一次为您检索一个项目,而不是预先拥有整个数据列表,这通常需要更多的内存。如果您愿意,这是一个“即时”可迭代的。但是,您无法保证它正在读取或缓存多少数据来执行此操作。有时它很可能已经拥有全部数据——你只是不知道,不看文档或代码。

如果确实是速度问题,那么在循环内部执行import time和添加调用time.sleep(1.0)会每次延迟一秒钟:但我怀疑这实际上不是问题所在,也不是解决方案应该是什么。也许您的查询正在检索太多数据,或者对象太大?

于 2011-01-29T16:29:41.803 回答