【问题标题】:How to slow down iteration of generator object fetching data from web service?如何减慢生成器对象从 Web 服务获取数据的迭代速度?
【发布时间】:2011-01-29 16:11:46
【问题描述】:

我正在使用 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 依赖项和使用本地应用引擎启动器的怪癖适用。

【问题讨论】:

  • 能否包含完整的堆栈跟踪以及触发它的相关代码?是否在 freebase 库中引发了异常?您是否检查了库的来源以了解为什么要提高它?

标签: python google-app-engine generator freebase


【解决方案1】:

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

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

【讨论】:

  • 它以分段的形式检索数据,但每隔一段时间,分段太大而造成严重破坏。但是我尝试按照您的建议使用 time.sleep,然后花时间清除 memcache 缓冲区(模块保存响应的位置),并且成功了!谢谢。
  • 也感谢生成器的解释,它比我从文档中读到的更有意义。
  • 请不要在 App Engine 中使用 time.sleep。找出问题的根源并解决它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-02
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 2018-09-01
  • 1970-01-01
相关资源
最近更新 更多