我正在将大量数据从数据库写入 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)
Run Code Online (Sandbox Code Playgroud)
我尝试过使用 ElemenTree().write(),但在http://lxml.de/api/lxml.etree._ElementTree-class的文档中找不到有关如何完成此操作的任何设置或最佳实践.html。
寻求减少总内存占用。
来自lxml 文档:
一种常见的模式是拥有一个或多个嵌套的 element() 块,然后在循环中构建内存中 XML 子树(使用 ElementTree API、构建器 API、XSLT 或其他方式)以将它们写入 XML 文件中一个接一个地。这样,它们可以在构建后立即从内存中删除,这可以大大减少应用程序的内存占用,同时保持整个 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
Run Code Online (Sandbox Code Playgroud)
写
<?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>
Run Code Online (Sandbox Code Playgroud)
到文件。