Django South 迁移内存泄漏

发布于 2024-11-01 02:05:08 字数 313 浏览 4 评论 0原文

我正在运行 Django 1.2.1 和 South 0.7.2 且 DEBUG = False。 仍然是一个非常简单的数据迁移泄漏内存:

def forwards(self, orm):
  for tr in orm.TestResult.objects.all():
    tr.software = tr.test_result.test_run.software
    tr.save()

TestResults 的数量相当大,但是除了长时间运行之外,这不应该是一个真正的问题。不幸的是,这个进程一直增长,直到我的机器内存不足。

I am running Django 1.2.1 with South 0.7.2 and DEBUG = False.
Still a very simple data migration leaks memory:

def forwards(self, orm):
  for tr in orm.TestResult.objects.all():
    tr.software = tr.test_result.test_run.software
    tr.save()

The amount of TestResults is pretty big, but that should not be a real problem besides a long runtime. Unfortunately the process grows till my machine is out of memory.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

别把无礼当个性 2024-11-08 02:05:08

我终于找到了解决我的问题的方法,以避免在 QuerySet 中进行缓存:

for tr in orm.TestResult.objects.iterator() :
    tr.software = ...

这里已经有人询问了:

Django:迭代没有缓存的查询集

以及Django文档中的解释:

http://docs.djangoproject.com/en/dev/ref/models/querysets/#iterator

I finally found the solution to my problem to avoid the caching in the QuerySet:

for tr in orm.TestResult.objects.iterator() :
    tr.software = ...

It was already asked on SO here:

Django : Iterate over a query set without cache

and the explanation in the Django docs:

http://docs.djangoproject.com/en/dev/ref/models/querysets/#iterator

故事和酒 2024-11-08 02:05:08

我认为在您的情况下,最好对所有对象执行 sql upate 查询,而不是一一更新记录。您可以将 execute 与 sql 语句一起使用像这个(我不知道你正在使用什么数据库或数据结构,所以这只是一个例子):

UPDATE TestResult
   SET TestResult.software = TestRun.software
  FROM TestResult JOIN TestRun
       ON TestResult.test_run_id = TestRun.id

I think it's better in your case to execute an sql upate query on all objects instead of updatnig records one by one. You can use execute with an sql statement like this one (I don't know what database or data stucture you're using, so this is just an example):

UPDATE TestResult
   SET TestResult.software = TestRun.software
  FROM TestResult JOIN TestRun
       ON TestResult.test_run_id = TestRun.id
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文