대용량 XML 파일(대형 노드의 경우 약 100GB)을 구문 분석하는 데 문제가 있습니다. 불필요한 라벨을 제거하여 노드 크기를 줄이려고 합니다. 예를 들어 임의의 <text>
태그입니다.
다음과 같은 기본 XML 파서를 사용하면xmlstarlet
xmlstarlet ed -P -d '//text' file.xml
나는 메모리가 부족하여 같은 문제에 직면하고 있습니다.
<text></text>
XML 구조를 파괴하지 않고 모든 쌍을 제거하는 안전한(낮은 메모리 공간) 방법이 있습니까 ?
답변1
나는 당신이 그것을 시도하는 것이 좋습니다xml_grep
, 속도는 느리지만 메모리 효율성이 매우 높습니다. perl-XML-Twig
(또는 xml-twig-tools
) - 트리 모드에서 대용량 Xml 문서를 처리하기 위한 Perl 모듈의 일부 입니다 . 이름별로 제외 노드를 사용할 수 있습니다 -v
. 을 참조하여 man xml_grep
작은 입력으로 명령을 테스트하십시오.
예:
xml_grep --nowrap -v 'text' input.xml > output.xml
또는 시간이 많이 걸리므로 진행률 표시줄을 사용하여 시청하세요.
pv input.xml | xml_grep --nowrap -v 'text' > output.xml
일반적인 경우에는 일부 sax/stream 모듈과 함께 Python, Perl, Java, Ruby(nokogiri) 또는 유사한 언어를 사용할 수 있습니다.
답변2
다음 XSLT 3.0 스타일시트가 해당 작업을 수행합니다.
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0">
<xsl:mode streamable="yes" on-no-match="shallow-copy"/>
<xsl:template match="text"/>
</xsl:template>
경고: 스트리밍 XSLT 프로세서가 필요할 것입니다. 이는 실제로 우리 회사인 Saxonica의 상용 제품인 Saxon Enterprise Edition을 의미할 것입니다.
또한 처리 속도는 물론 하드웨어에 따라 약 2Gb/min 정도일 것입니다.
또 다른 방법은 SAX와 같은 API를 사용하여 이를 수행하는 자신만의 코드를 작성하는 것입니다.