0

私は simplexml_load_file を使用して 15,000 レコードの xml ファイルを解析してきましたが、問題なく動作していましたが、多くのファイルを操作しようとすると、それぞれが 15,000 になり、この errorPHP が発生しました

Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 64 bytes)

何をすべきかわからない、以下は私がやっていることのサンプルです、

$xml = simplexml_load_file($file)
       or die("Error: Cannot create object");

foreach($xml->children() as $events){
                foreach($events->load as $load){
                        $record = $load->loadrecord['record']."    ";
                        if ($load->loadrecord['record'] == "test"){
                                foreach($events->receiveds as $received){
                                $release = $received->received['release'];
                                }
                                foreach($events->sender as $sender){
                                $test1 = $sender['test1'];
                                $test2 = $sender['test2'];
                                $test3 = $sender['test3'];
                                $test4 = $sender['test4'];
                                }
                                foreach($events->screens as $filter){
                                $record = $filter->filter['record'];
                                }
                        }
}

解析が完了した後に何かを解放する必要がありますか?ファイルが多数ある場合に問題が発生することに注意してください.2つのファイルで試してみましたが、問題はありませんでした

4

4 に答える 4

2

大きなファイルには simplexml を使用しないでください。XML DOM オブジェクトを使用してください。

SAX、XMLReader、またはその他のサードパーティなどの高度なツールを使用して、データを解析できます。

于 2012-11-02T22:38:23.727 に答える
1

最後に問題が見つかりました。各反復後に設定を解除する必要があります。たとえば、ここで $xml を設定解除する必要があります

$xml = simplexml_load_file(file_name )
foreach($xml->children() as $logs){
do_stuff
unset($xml);
}

以前持ってたのはこんな感じ

$xml = simplexml_load_file(file_name )
foreach($xml->children() as $logs){
do_stuff
}
unset($xml);

あなたの指導がなければ、本当にそれを見つけることはできなかったでしょう

于 2012-11-03T03:33:28.177 に答える
0

cron ジョブを使用してこれらのファイルを 1 つずつ処理し、出力をどこかに保存して、終了時に出力を取得することを検討できます。

もちろん、これはすぐに結果を必要としないことに依存しています。実行した場合は、このプロセスを開始し、AJAX リクエストを使用して、いつ完了したかを確認し、最終的な出力を取得できます。

明らかに、ニーズと要件は、それが実現不可能であることを意味する場合があります。メモリ制限を引き上げることはオプションですが、共有ホスティング プラットフォームを使用している場合は通常そうではありません。また、問題を解決するのではなく、問題を回避することも意味します (つまり、レコードの数が再び増加すると、問題が再発します)。

編集:質問を読み間違え、それに合わせて回答を修正しました。

于 2012-11-02T22:04:26.907 に答える
0

残念なことに、SimpleXML クラスは XML ファイル全体をメモリにロードします。大きなファイルを指定すると、明らかに問題が発生します。

代わりに、XMLReader クラスを使用する必要があります。このクラスは、XML を一度に 1 要素ずつ読み取り、読み取り後に破棄します。これは、一度にメモリ内に最小限のデータしかないことを意味します。

このクラスを使用する便利な方法は、Iterator クラスでラップすることです。foreach()これは、一度にすべてロードされたかのように、要素をループするためにを使用できることを意味します。

XMLReader の Iterator クラスの優れた例へのリンクを次に示します。まさにこの問題を抱えていたとき、このクラスが非常に役立つことがわかりました。ニーズに合わせていくつかの微調整を行う必要がありましたが、最初はほとんどうまくいきました. それがあなたにとってもうまくいくことを願っています。

于 2012-11-02T22:54:20.197 に答える