2016-07-22 7 views
0

ファイルを解析するためにsimpleXMLを使用しています(約341MB)。 ファイルをロードすると、大量のRAMが消費されますが問題ありません。私の主な問題は、cronが終了するまでメモリが解放されないということです。SimpleXMLロードファイルから空きメモリを消費

参照されたxmlオブジェクトを設定解除すると、メモリ内ファイル用に予約されたメモリも解放されると仮定しましたが、そうではありません。

参照ファイルのメモリを解放することはできますか?

例コード(GCが助けることができるかどうか知らない):

gc_enable(); 
$this->xml = simplexml_load_file($filePath); 
$val = $this->getValues('/SOME/PATH/HERE'); 

foreach($val as $a) { 
    $this->tags[] = (string) $a->$tagName; 
} 

$this->xml = null; 
unset($this->xml); 
gc_collect_cycles(); 
+0

XML文書のノードへの参照がありますが、これは決して解除していないことがあります(SimpleXMLがメモリ全体を残す原因となります)。もしそうでなければ、PHPのメモリマネージャの複雑さの一例に過ぎません。ここで良い話があります:https://www.youtube.com/watch?v=sm1HUrnsxLI – IMSoP

+0

他の言及はありませんが、これはコード全体です。これはコンストラクタの一部ですが、XML変数はコンストラクタのスコープ内にのみあります。 – Drakoumel

答えて

-1

私は非常に大きなXMLファイルと同様の問題を持っていた(私はループ内の別のシステムからインポート多くの1-5Mb XMLファイルを解析した)ので、私XMLReaderのに移動し、

$reader = new XMLReader(); 
$reader->open("path_to_file.xml", "UTF-8", LIBXML_NOBLANKS); 
/*do some parsing(probably you'll need iterate over nodes using next). 
* Note that if you use XMLReader then any #text nodes even 
* only containing new lines and spaces are being read 
* unless you set option LIBXML_NOBLANKS 
*/ 
$reader->close(); 

のようなコードを書いたのlibxmlによって割り当てられたこの少なくとも割り当て解除のリソースを、大きな文書を処理している間、それは方法より少ないメモリを使用します。

+0

ありがとうございますが、これは私の質問には答えません。私はXMLReaderを認識していますが、問題はパフォーマンスです。 simpleXMLのプラスはスピードです。ファイル全体を1秒間に解析します。 – Drakoumel

+0

あなたがあなたのコードで使用しているすべてのノードの設定を解除しますか($ xmlオブジェクトだけでなく) –