如何使这个python脚本内存有效

时间:2011-05-23 02:58:04

标签: python django gzip data-dump memory-optimization

此代码段从我的数据库中提取所有文档,并将它们转储到gzip压缩文件中。 docs_to_dump是一个django对象,包含要转储的所有文本文档。

os.chdir(dump_dir)
filename = 'latest-' + court_id + '.xml.gz.part'
with myGzipFile(filename, mode='wb') as z_file:
    z_file.write('<?xml version="1.0" encoding="utf-8"?>\n<opinions dumpdate="' + str(date.today()) + '">\n')

    for doc in docs_to_dump:
        row = etree.Element("opinion",
            dateFiled           = str(doc.dateFiled),
            precedentialStatus  = doc.documentType,
            local_path          = str(doc.local_path),
            time_retrieved      = str(doc.time_retrieved),
            download_URL        = doc.download_URL,
            caseNumber          = doc.citation.caseNumber,
            caseNameShort       = doc.citation.caseNameShort,
            court               = doc.court.get_courtUUID_display(),
            sha1                = doc.documentSHA1,
            source              = doc.get_source_display(),
            id                  = str(doc.documentUUID),
        )
        if doc.documentHTML != '':
            row.text = doc.documentHTML
        else:
            row.text = doc.documentPlainText.translate(null_map)
        z_file.write('  ' + etree.tostring(row).encode('utf-8') + '\n')

    # Close things off
    z_file.write('</opinions>')

不幸的是,它还消耗了大量的内存,以至于操作系统无法控制它。我认为通过写入“类文件对象”,压缩文件将在运行中生成,并且内存将保持相对较低。相反,它占用了数百MB,然后崩溃。

我不是压缩方面的专家,但我的印象是整个压缩文件都存储在内存中。

我应该采取更好的方式吗?

编辑 - 整个文件位于:https://bitbucket.org/mlissner/search-and-awareness-platform-courtlistener/src/2ca68efd8017/data-dumps/data-dumper.py

1 个答案:

答案 0 :(得分:2)

我认为安德鲁斯基可能是对的。如果您遇到崩溃,请尝试调整您的查询以使用iterator方法

类似的东西。

docs_to_dump = Document.objects.all().order_by('court').iterator()

应该不要将整个Queryset加载到内存中。