python - 使用 Django 的 Python 脚本中的明显内存泄漏

标签 python django memory-leaks out-of-memory

我有一个用于构建站点地图的脚本 - 对于每个相关模型,我生成了许多分页站点地图,每个对象都有一个 URL,并且我打算每周再次运行该脚本使用新数据重新生成站点地图。

然而,当我在我的 Ubuntu 服务器上运行这个脚本时,内存使用率一直在攀升,直到进程最终被操作系统终止。这是我目前无法通过的功能:

def xml_for_page(object):
    sOutText = "\t<url>\n"

    sURL = object.url()
    sOutText += "\t\t<loc>http://www.mysite.com%s</loc>\n" % sURL

    sLastModified = object.last_status_change.isoformat()
    sOutText += "\t\t<lastmod>%s</lastmod>\n" % sLastModified

    sChangeFreq = "monthly"
    sOutText += "\t\t<changefreq>%s</changefreq>\n" % sChangeFreq

    sOutText += "\t</url>\n"

    return sOutText

def generate_object_map():

    # Do this in chunks of ITEMS_PER_FILE
    bFinished = False
    iOffset = 0
    iCurrentPage = 0

    while not bFinished:
        objResults = PageObject.objects.filter(submission_status=SUBMISSION_STATUS_ACCEPTED).order_by('-popularity')[iOffset:iOffset+ITEMS_PER_FILE]
        if objResults.count() < 1:
            break
        sFilename = "%s/sitemap-objects-%i.xml" % (OUTPUT_DIR, iCurrentPage)
        fObjects = open(sFilename, 'w')
        fObjects.write('<?xml version="1.0" encoding="UTF-8"?>\n')
        fObjects.write('<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n')
        for object in objResults:
            fObjects.write(xml_for_page(object))
        fObjects.write('</urlset>')
        fObjects.close()
        iOffset += ITEMS_PER_FILE
        iCurrentPage += 1

所以这里发生的事情是:while not bFinished 循环的每次迭代我们都会为我们所在的页面创建一个新文件,并在数据库中查询该特定对象集。然后我们遍历这些对象并将该页面的 XML 写入站点地图文件。写入这些后,我们关闭该文件并启动另一个文件。这种分页行为的原因是,当将所有条目写入一个文件时,我很快就达到了内存限制。这比当时表现得更好,但是当我使用 resource 跟踪内存使用情况时,我可以看到它在每个文件写入后都在攀升。数据库中大约有 200,000 个这种类型的对象,因此理想情况下我需要使其尽可能可扩展。但是我看不出在主循环的每次迭代之后内存是如何保留的: QuerySet 对象在每次迭代后被重写,并且文件句柄在每次迭代后关闭并重新分配.我认为 Python 的 GC 行为将允许在重新分配变量后清理不再使用的对象。不是这样吗?

最佳答案

The docs似乎建议使用允许相关字段的 object.values_list('foreignobject__url') 会很好。因此,如果 foreignobject 是您模型中的外键,它本身包含字段 url,您可以安全地使用 values_list 以减少数据库调用。

关于python - 使用 Django 的 Python 脚本中的明显内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21190121/

相关文章:

django - 如何在TemplateTag中获取request.user

c++ - MySQL createStatement() 内存泄漏

python - 谷歌搜索与 python 请求库

python - 如何将本地目录包含到 Sphinx 文档中?

python - 从日期时间列表中获取最早和最晚时间

python - Django 1.10 模板的默认身份验证路径

python - 将图像旋转 90° 时,如何阻止 PIL 交换高度/宽度?

python - 梯度下降

objective-c - 在 UIViewController 中加载和卸载数据

ios - 删除 subview (ARC)后内存未释放