2016-07-22 2 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

I 있었다 꽤 큰 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 객체뿐만 아니라). –