如何使此python脚本提高内存效率

如何使此python脚本提高内存效率,python,django,gzip,data-dump,memory-optimization,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"?&

这个片段将所有文档从我的数据库中取出,并将它们转储到一个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>')
os.chdir(转储目录)
filename='latest-'+court_id+'.xml.gz.part'
将mygzip文件(文件名,mode='wb')作为z_文件:
z_file.write('\n\n')
对于文档中的文档\u到\u转储:
行=etree.Element(“意见”,
DateField=str(文件日期归档),
PrecentialStatus=doc.documentType,
本地路径=str(文档本地路径),
检索到的时间=str(检索到的文件时间),
download\u URL=doc.download\u URL,
案例编号=doc.citation.caseNumber,
caseNameShort=doc.citation.caseNameShort,
court=doc.court.get\u courtUUID\u display(),
sha1=文件sha1,
source=doc.get\u source\u display(),
id=str(文档编号),
)
如果doc.documentHTML!='':
row.text=doc.documentHTML
其他:
row.text=doc.documentPlainText.translate(空映射)
z_file.write(“”+etree.tostring(行).encode('utf-8')+'\n'))
#封锁
z_文件。写入(“”)
不幸的是,它也消耗了太多的内存,以至于操作系统将其销毁。我认为,通过向“类似文件的对象”写入,压缩文件将在运行中生成,并且内存将保持相对较低。相反,它占用了数百MB,然后崩溃了

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

有没有更好的办法让我这么做


编辑——整个文件都在这里:

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

差不多

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

应避免将整个查询集加载到内存中。

以及如何检索
文档以转储
?这是通过
.objects.all()
进行的数据库查询吗?其实没什么。通过给with语句一个退出函数来支持它。@Torsten,有时是的。其他时候,它是一个字段上的过滤器。我想知道它是否能达到显示的代码。在我看来,构建
docs\u to\u dump
将是一个昂贵的部分。你确定在内存不足之前创建了
docs\u to\u dump
吗?如果你对Andrewski的问题的回答是否定的,你是否尝试过将
compresslevel
设置得更低?+1我也怀疑这一点,这就是为什么我之前问“如果你写入未压缩的文件,它是否会消耗更少的内存?”在看过迭代器方法的文档之后,我认为这是最有可能的罪魁祸首。没有区别,所以我输入了一些打印语句并进行了一些分析。错误发生在压缩之前,所以我在这里使用了迭代器代码,它可以工作:。谢谢你帮我找到了正确的方向。