我正在尝试转换大约。通过将某个标签的所有元素放入新文件中,将 100MB XML 文件转换为另一个 XML 文件。由于传统的写作会导致记忆问题,我想使用 Mako 模板来做。XML 中有大约 60000 个元素,为了保持低内存使用率,我尝试将生成器传递给模板。但是,这导致了段错误。我对内存管理的了解非常少,但这似乎与将内容放在模板中有关,因为当我“只是打印”元素时不会出现问题。我是否滥用模板渲染来做一些不适合的事情?如何解决这个问题?
我的渲染代码:
from lxml import etree
from mako.template import Template
from mako.runtime import Context
ns = {'xmlns': 'http://namesp.ace/version/1'}
## get xml elements with correct tag
featgen = etree.iterparse('somefile.xml', tag='{%s}sometag' % ns['xmlns'], events=('start',))
templatefn = 'template.mako'
# create template
template = Template(filename=templatefn)
with open('outfile', 'w') as fp:
ctx = Context(fp, tag=featgen)
template.render_context(ctx)
和模板:
<%! from lxml import etree
def tostr_xml(el, ns):
strxml = etree.tostring(el)
el.clear()
strxml = strxml.replace('xmlns="{0}" '.format(ns['xmlns']), '')
strxml = strxml.replace('xmlns:p="{0}" '.format(ns['xmlns:p']), '')
strxml = strxml.replace('xmlns:xsi="{0}" '.format(ns['xmlns:xsi']), '')
return strxml
%>
<?xml version='1.0' encoding='ASCII'?>
<root>
<features>
% for ev,el in tag:
${tostr_xml,el, {'xmlns':'http://namesp.ace/version/1'})}
% endfor
</features>
</root>