대용량(>2GB) XML 파일에서 노드를 제거하는 방법은 무엇입니까?

대용량(>2GB) XML 파일에서 노드를 제거하는 방법은 무엇입니까?

저는 여러 개의 대용량(>2GB) XML 파일을 작업하고 있는데 그 크기로 인해 문제가 발생하고 있습니다.

(내 응용 프로그램은 PHP 스크립트에서 XMLReader를 사용하여 ~500mb의 작은 파일을 구문 분석하는데 이는 훌륭하게 작동하지만 XMLReader는 이러한 큰 파일을 열지 않습니다.)

그래서 제 생각은 필요하지 않은 파일의 큰 상위 노드를 제거하는 것입니다.

예를 들어, 파일이 다음과 같이 구성되어 있는 경우:

<record id="1">
    <a>
        <detail>blah</detail>
        ....
        <detail>blah</detail>
    </a>
    <b>
        <detail>blah</detail>
        ....
        <detail>blah</detail>
    </b>
    <c>
        <detail>blah</detail>
        ....
        <detail>blah</detail>
    </c>
</record>
...
<record id="999999">
    <a>
        <detail>blah</detail>
        ....
        <detail>blah</detail>
    </a>
    <b>
        <detail>blah</detail>
        ....
        <detail>blah</detail>
    </b>
    <c>
        <detail>blah</detail>
        ....
        <detail>blah</detail>
    </c>
</record>

<a>내 목적을 위해서는 상위 노드의 데이터만 필요합니다.각 레코드. 부모 노드를 제거할 수 <b>있고<c> 각 레코드에서, 작업하기에 충분히 작도록 파일 크기를 크게 줄일 수 있습니다.

이와 같은 작업을 수행하는 가장 좋은 방법은 무엇입니까?

sed나는 대부분의 "XML 인식" 유틸리티를 이러한 대용량 파일에 대해 시도했으므로 이 작업을 수행하기 위해 또는 이와 유사한 것을 사용할 수 있기를 바랍니다 grep.

답변1

awk를 사용할 수 있습니다.

$cat my.xml | awk '/<b>/{hide=1} /<\/record>/ {hide=0} {if (hide==0) print;}' >mynew.xml

이렇게 하면 포함 라인 이후의 모든 내용이 숨겨지고 <b>포함 라인부터 시작하여 표시됩니다.</record>

귀하의 의견에 따르면 XML이 하나의 큰 줄인 경우 여러 줄로 나누고 변환을 마친 후 개행을 제거하십시오.

$cat my.xml|sed 's/>/>\n/g'| awk ....... | tr -d '\n' >.....

XML을 버리고 YAML 또는 JSON을 사용해 보세요!

답변2

개인적으로 저는 C(어셈블리 전 가장 낮은 수준)에서 작업을 수행하고 libxml을 사용하여 모든 노드를 반복합니다.

여기 몇 가지 예가 있어요.http://www.xmlsoft.org/examples/

GCC를 사용하여 코드를 컴파일합니다.

관련 정보