大容量ファイルからXMLタグを削除する

大容量ファイルからXMLタグを削除する

大容量のXMLファイル(大規模ノードの場合は約100 GB)を解析するのに問題があります。不要なラベルを削除してノードのサイズを縮小しようとしています。たとえば、ランダムな<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程度となります。

もう1つの方法は、SAXなどのAPIを使用してこれを行う独自のコードを書くことです。

関連情報