4

500 mb xmlファイルをロードし、xslテンプレートを使用してファイルを解析するページがあります。パーサーは私のローカル環境で完全に機能します。WAMPを使用しています。

Webサーバー上。

警告:DOMDocument :: load()[domdocument.load]:(null)xmlSAX2Characters:/home/mydomain/public_html/xslt/largeFile.xmlのメモリ不足、行:/home/mydomain/public_html/xslt/parser_largeの2031052 6行目の.php

私のコードは以下の通りです、6行目はxmlファイルをロードします

<?php
$xslDoc = new DOMDocument();
$xslDoc->load("template.xslt");

$xmlDoc = new DOMDocument();
$xmlDoc->load("largeFile.xml");

$proc = new XSLTProcessor();
$proc->importStylesheet($xslDoc);
echo $proc->transformToXML($xmlDoc);
?>

php.iniファイルをwampインストールから上記のコードが配置されているフォルダーにコピーしてみました。しかし、これは役に立ちませんでした。このphp.iniファイルのメモリ制限はmemory_limit=1000Mです。

これに関するアドバイス/経験は大歓迎です

4

1 に答える 1

5

これが悲しい真実です。XMLを操作する基本的な方法は2つあります。1つはXMLファイル全体が一度にメモリ内に存在するDOMベースであり(トラバースを高速化するためにかなりのオーバーヘッドがあります)、SAXベースではファイルがメモリを通過する場所になりますが、そのごく一部はいつでも存在します。

ただし、DOMを使用すると、大量のメモリを消費するのはごく普通のことです。

現在、XSLT言語は一般に、ファイル全体の任意の部分にいつでもアクセスできる構造を許可しているため、DOMスタイルが必要です。一部のプログラミング言語には、SAX入力をXSLTプロセッサにフィードできるライブラリがありますが、これは必然的に、XSLT言語またはDOMよりもはるかに優れたメモリ消費の制限を意味します。ただし、 PHPにはXSLTにSAX入力を読み取らせる方法がありません。

それは私たちにDOMの代替案を残します。1つあり、SimpleXMLと呼ばれます。SimpleXMLは、ドキュメントに名前空間がある場合に使用する のが少し難しいです。古代のベンチマークは、大きなファイルのDOMよりもいくらか高速で、おそらくメモリ消費の無駄が少ないことを示しているようです。

そして最後に、私は別のプログラミング言語で一度あなたの立場になりました。解決策は、単純なルールに基づいてドキュメントを小さなドキュメントに分割することでした。各小さなドキュメントには、ドキュメント全体からコピーされたヘッダー、1つの「詳細」要素、およびフッターが含まれており、その形式は大きなXMLファイルのスキーマに対して有効です。XSLTを使用して処理され(1つの詳細要素の処理が他の詳細要素を調べないことを前提としています)、出力が組み合わされました。これは魅力のように機能しますが、数秒で実装されません。

だから、ここにあなたのオプションがあります。いずれかを選択してください。

  • SAXを使用してXMLを解析および処理します
  • SimpleXMLを使用して、同じメモリ内で少し大きいファイルを許可することを期待してください。
  • 外部XSLTプロセッサを実行し、同じメモリ内で少し大きいファイルを許可することを期待します。
  • この方法を使用してXMLを分割およびマージし、XSLTを小さなチャンクにのみ適用します。この方法は、一部のスキーマでのみ実用的です。
于 2012-06-25T21:28:38.433 に答える