대용량 파일에서 XML 태그 제거

대용량 파일에서 XML 태그 제거

대용량 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를 사용하여 이를 수행하는 자신만의 코드를 작성하는 것입니다.

관련 정보