簡體   English   中英

在Python中生成非常大的XML文件?

[英]Generating very large XML files in Python?

有沒有人知道在Python中生成非常大的xml文件(例如100-500 MiB)的內存有效方法?

我一直在使用lxml ,但內存使用是通過屋頂。

也許您可以使用模板引擎而不是自己生成/構建xml?

例如, Genshi是基於xml的,並支持流輸出。 一個非常基本的例子:

from genshi.template import MarkupTemplate

tpl_xml = '''
<doc xmlns:py="http://genshi.edgewall.org/">
<p py:for="i in data">${i}</p>
</doc>
'''

tpl = MarkupTemplate(tpl_xml)
stream = tpl.generate(data=xrange(10000000))

with open('output.xml', 'w') as f:
    stream.render(out=f)

可能需要一段時間,但內存使用量仍然很低。

Mako模板引擎的相同示例(不是“本機”xml),但速度要快得多:

from mako.template import Template
from mako.runtime import Context

tpl_xml = '''
<doc>
% for i in data:
<p>${i}</p>
% endfor
</doc>
'''

tpl = Template(tpl_xml)

with open('output.xml', 'w') as f:
    ctx = Context(f, data=xrange(10000000))
    tpl.render_context(ctx)

最后一個例子在我的筆記本電腦上運行了大約20秒,產生了一個(無可否認的非常簡單)151 MB xml文件,完全沒有內存問題。 (根據Windows任務管理器,它保持不變大約10MB)

根據您的需要,這可能是比使用SAX等更友好,更快捷的生成xml的方法...查看文檔以了解您可以使用這些引擎做什么(還有其他的,我剛剛選擇這兩個例子)

生成如此大的XML文件的唯一合理方法是逐行,這意味着在運行狀態機時進行打印,以及大量測試。

顯然,你必須避免在內存中構建整個樹(無論是DOM還是etree或其他)。 但最好的方法取決於數據的來源以及輸出結構的復雜性和相互關聯性。

如果它很大,因為它有數千個相當獨立的項目實例,那么你可以生成外層包裝器,然后為每個項目構建樹,然后將每個片段序列化到輸出。

如果片段不那么獨立,那么你需要做一些額外的簿記 - 比如管理生成的id和idrefs的數據庫。

我會把它分成2或3個部分:sax事件生成器,輸出序列化器吃sax事件,並且可選地,如果看起來更容易使用一些獨立的部分作為對象或樹,那么構建這些對象然后將它們變成序列化程序的sax事件。

也許你可以將它全部作為直接文本輸出來管理,而不是處理sax事件:這取決於它的復雜程度。

這也可能是一個使用python生成器作為流式輸出的方式而不必在內存中構建大型結構的好地方。

如果您的文檔非常規則(例如一堆數據庫記錄,所有格式都相同),您可以使用我自己的“xe”庫。

http://home.avvanta.com/~steveha/xe.html

xe庫設計用於生成聯合供稿(Atom,RSS等),我認為它易於使用。 我需要為Python 2.6更新它,我還沒有,抱歉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM