大容量の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を使用してこれを行う独自のコードを書くことです。