我正在将大量数据从数据库写入XML文件。我正在使用Python及其lxml库来创建文件。 我注意到它在内存中生成整个XML文件,然后在最后将它输出到文件,有没有办法为每X个数据库对象转储xml文件?
import lxml.etree as etree
import os
root = etree.Element('root')
db_obj1 = etree.SubElement(root, 'item')
db_obj2 = etree.SubElement(root, 'item')
db_obj3 = etree.SubElement(root, 'item')
et = etree.ElementTree(root)
et.write(sys.stdout)
我已尝试使用ElemenTree()。write(),但在http://lxml.de/api/lxml.etree._ElementTree-class.html的文档中找不到任何关于如何完成此操作的设置或最佳做法。
希望减少总内存占用量。
答案 0 :(得分:3)
拥有一个或多个嵌套的element()块是一种常见的模式, 然后在循环中构建内存中的XML子树(使用ElementTree API,构建器API,XSLT或其他)将它们写入 XML文件一个接一个。这样,他们就可以从中删除 在他们建造之后的记忆,可以大大减少 应用程序的MEMORY FOOTPRINT,同时保留整个XML 一代轻松,安全,正确。 [强调我的]。
filename = "/tmp/somefile.xml"
with ET.xmlfile(filename, encoding='utf-8') as xf:
xf.write_declaration(standalone=True)
xf.write_doctype('<!DOCTYPE root SYSTEM "some.dtd">')
with xf.element('root'):
for value in '123':
# construct a really complex XML tree
el = ET.Element('item', attr=value)
xf.write(el)
# no longer needed, discard it right away!
el = None
写入
<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<!DOCTYPE root SYSTEM "some.dtd">
<root><item attr="1"/><item attr="2"/><item attr="3"/></root>
到文件。