2013-10-25 3 views
0

약 변환하려고합니다. 특정 태그의 모든 요소를 ​​새 파일에 넣음으로써 100MB의 XML 파일을 다른 XML 파일로 변환 할 수 있습니다. 기존의 글쓰기는 메모리 문제를 야기했기 때문에 Mako 템플릿을 사용하고 싶었습니다. XML에는 약 60000 개의 요소가 있으며 메모리 사용량을 낮게 유지하기 위해 템플릿에 생성기를 전달하려고했습니다. 그러나 이로 인해 세그 폴트가 발생했습니다. 메모리 관리에 대한 지식은 매우 낮지 만, 내용을 템플릿에 넣는 것과 관련이 있습니다. 인쇄 할 때 아무런 문제가 발생하지 않습니다. 템플릿 렌더링을 남용하지 않는 것을 남용하고 있습니까? 어떻게 해결할 수 있을까요?대용량 생성기가있는 XML 템플릿 렌더링 세그 폴트

내 렌더링 코드 :

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> 

답변

0

내가 설정하여 문제를 해결 :

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

로 :

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

그러나 나는 왜 이것이 작동하는지 말할 수 없습니다. 누군가가 설명하고 싶다면 대신 그 대답을 받아 들일 것입니다.

관련 문제