此代码段从我的数据库中提取所有文档,并将它们转储到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,然后崩溃。
我不是压缩方面的专家,但我的印象是整个压缩文件都存储在内存中。
我应该采取更好的方式吗?
答案 0 :(得分:2)
我认为安德鲁斯基可能是对的。如果您遇到崩溃,请尝试调整您的查询以使用iterator方法
类似的东西。
docs_to_dump = Document.objects.all().order_by('court').iterator()
应该不要将整个Queryset加载到内存中。