私は大容量のXMLファイルを300mb持っています。これをXSLTで変換しようとすると、メモリエラーが発生してしまいます。そのエラーを発生させずにXMLファイルを正常に変換できます。VB6とXSLTを使用して大規模なXMLファイルを変換する
私はVB6を使用してXMLをXSLT 1.0で変換し、imはDOMDocumentを使用してXMLドキュメントをロードしています。
私は大容量のXMLファイルを300mb持っています。これをXSLTで変換しようとすると、メモリエラーが発生してしまいます。そのエラーを発生させずにXMLファイルを正常に変換できます。VB6とXSLTを使用して大規模なXMLファイルを変換する
私はVB6を使用してXMLをXSLT 1.0で変換し、imはDOMDocumentを使用してXMLドキュメントをロードしています。
ここではかなり古代のテクノロジーを使用していますが、あなたがその環境に永遠に拘束されているかどうかは疑問からはっきりしません。
300Mbは、Saxonなどの最新のXSLTプロセッサを使用して実行できますが、おそらく2Gbのメモリが必要になります。多くのXSLTプロセッサには、DOMよりも空間効率の良い内部ツリーモデルがありますが、MSXMLをどこに置いているのか分かりません。
あなたが行っている変換やストリーミングに適しているかどうか(つまり、メモリ内にツリーモデル全体を構築しないで処理するかどうか)はわかりません。潜在的にストリーム可能な場合は、(XSLT 3.0を含む)さまざまなアプローチが考えられますが、VB6のオプションは非常に限られている可能性があります。
Bob77が指摘しているように、この軽量テクノロジを使用してに確実に変換し、XSLT
変換を書き直す必要があります。
クラスモジュールを作成し、文Implements IVBSAXContentHandler
を含めます。
それが読まれると、ファイルが解析されているとして、場で必要な変更を行うには、イベントIVBSAXContentHandler_startElement
とIVBSAXContentHandler_endElement
を使用してください。
すぐに使用できるSAXクラスの例は、MSDNで十分です。
MSXML IXSLProcessorはDOMからの入力を受け入れる必要がありますが、その出力はSAXライターを介して送信できます。これは、出力DOMのメモリペナルティを排除します。 – Bob77
可能であれば、XSLTを完全に破棄し、SAX入出力を使用して変換するカスタムプログラムを作成します。 XSLTは、限られたスクリプト環境での軽量使用のために設計されています。 – Bob77