0

私はおおよそを変換しようとしています。特定のタグのすべての要素を新しいファイルに入れることにより、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>
4

1 に答える 1

0

次のようにして問題を解決しました。

featgen = etree.iterparse('somefile.xml', tag='{%s}sometag' % ns['xmlns'], events=('start',))

の中へ:

featgen = etree.iterparse('somefile.xml', tag='{%s}sometag' % ns['xmlns'])

しかし、なぜこれが機能するのかは言えません。誰かが説明したい場合は、代わりにその答えを受け入れます。

于 2013-10-28T13:36:49.013 に答える