2016-07-22 18 views
0

消耗。 加載文件時,它會消耗相當數量的RAM,這沒關係。我的主要問題是內存不能釋放,直到cron退出。SimpleXML的可用內存,我使用SimpleXML來解析文件(大約341 MB)從加載文件

我認爲,如果我取消設置所引用的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對象)嗎? –