5

什么是迭代编写 XML 文件的快速方法(即,无需将整个文档放在内存中)?xml.sax.saxutils.XMLGenerator工作但很慢,在 I7 机器上大约 1MB/s。这是一个测试用例

4

2 回答 2

4

我意识到这个问题已经被问过一段时间了,但是与此同时,lxml已经引入了一个在解决问题方面看起来很有希望的 API:http: //lxml.de/api.html;具体而言,请参阅以下部分:“增量 XML 生成”。

我通过流式传输 10M 文件快速对其进行了测试,就像在您的基准测试中一样,在我的旧笔记本电脑上只花了几分之一秒,这绝不是非常科学的,但与您的generate_large_xml()功能完全一样。

于 2016-03-04T12:51:16.697 回答
3

正如Yury V. Zaytsev所提到的,lxmlrealy 提供了用于以流方式生成 XML 文档的 API

这是工作示例:

from lxml import etree

fname = "streamed.xml"
with open(fname, "w") as f, etree.xmlfile(f) as xf:
    attribs = {"tag": "bagggg", "text": "att text", "published": "now"}
    with xf.element("root", attribs):
        xf.write("root text\n")
        for i in xrange(10):
            rec = etree.Element("record", id=str(i))
            rec.text = "record text data"
            xf.write(rec)

生成的 XML 如下所示(从单行 XML 文档重新格式化的内容):

<?xml version="1.0"?>
<root text="att text" tag="bagggg" published="now">root text
    <record id="0">record text data</record>
    <record id="1">record text data</record>
    <record id="2">record text data</record>
    <record id="3">record text data</record>
    <record id="4">record text data</record>
    <record id="5">record text data</record>
    <record id="6">record text data</record>
    <record id="7">record text data</record>
    <record id="8">record text data</record>
    <record id="9">record text data</record>
</root>
于 2016-05-01T14:21:00.220 回答