gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:07:27 25 4
gpt4 key购买 nike

我有一个用于构建站点地图的脚本 - 对于每个相关模型,我生成了许多分页站点地图,每个对象都有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com