【问题标题】:Django: Unbuffered mysql queryDjango:无缓冲的 mysql 查询
【发布时间】:2009-09-19 14:32:11
【问题描述】:

我怎样才能不将 mysql 的完整结果集复制到 django 的内存中?我正在迭代一个 BIG 表,该表在查询复制时会炸毁我的内存。

似乎mysql为此使用了SSCursor,我可以用mysql低级接口完成所有这些,但是有Django的方法吗?

【问题讨论】:

  • 您需要整个结果集吗?最小化查询返回的行是否有效?
  • 不,我必须对每行进行一次操作,但我永远不会重新访问任何过去的行,因此将它们放在内存中是一种浪费。

标签: mysql django


【解决方案1】:

这将在每次迭代中获得 500 个项目:

count = Model.objects.count()
chunk = 500
for i in range((count/chunk)+1):
    objs = list(Model.objects.all()[i*chunk:(i+1)*chunk])

您可能还想看看QuerySet method iterator()

【讨论】:

  • 这是否与数据集上的无缓冲游标一样最佳?如果不是,会差多少?
  • Afaik 这实际上是“从表 LIMIT OFFSET 中选择内容”。你担心你的内存使用,这会解决它,因为它只是在内存中保留固定数量的行。缺点是有多个 SQL 查询,但这应该不会太糟糕。
  • iterator() 东西似乎是逐行读取结果的,所以它可能就是你要找的东西。
  • 实际上,iterator() 也很遗憾地将整个内容保存在内存中
猜你喜欢
  • 2014-04-11
  • 2016-12-23
  • 2010-10-24
  • 2012-04-28
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
相关资源
最近更新 更多