2012-04-11 4 views
1

큰 XML을 구문 분석해야합니다. f.ex 100MB (훨씬 더 많을 수 있음).PHP에서 BIG XML 구문 분석하기

예를 들어

: XML은 다음과 같습니다

<notes> 
    <note> 
    <id>cdsds32da435-wufdhah</id> 
    <to>Tove</to> 
    <from>Jani</from> 
    <heading>Reminder</heading> 
    <body>Don't forget me this weekend!</body> 
    </note> 


x 1000000 different notes(or even more) 

</notes> 

각 노트는 유엔의 고유 ID가 있습니다. 필자가 XML을 파싱 할 때 INSERT가 아니라면 DB에 특정 ID로 노트가 있는지 먼저 찾아야합니다.

성능에 문제가 있습니다 (2 시간 소요). 하나의 SELECT를 사용하여 DB에서 모든 ID를 가져 오려고하지만 DB를 매번 요청하지 않으며 PHP 배열 (메모리)에 저장합니다. 내가 블로그는

$sql = "SELECT id FROM 'notes'"; 
... 
$ids = Array with all ids 

또한 루프에서 xml_parser과 XML을 구문 분석 :

while($data = fread($Xml, '512')) { 
    xml_parse($xmlParser, $data); 
} 

내가 그 PHP 그것을 처리하기 위해 너무 큰 변수를 생성 할 수 simple_xml_parser과 XML을 구문 분석 생각합니다.

if (array_search($note->id, $ids) === FALSE) { 
    //than insert it 
} 

그러나 너무 오래 걸립니다 :

그리고 나는 그것이 $ ID를에있는 경우 내가 확인 메모 ID가있을 때보 다

. 그래서 나는 PHP가 Juddy Arrays라고 불리는 특별한 배열을 가지고 있다는 것을 알았습니다. http://php.net/manual/en/book.judy.php 그러나 이것들이 정확히 무엇인지는 정확히 알지 못합니다 - 빠른 구문 분석을위한 BIG Array를 의미합니다.

많은 변수에서 DB의 ID를 저장하는 Memcached도 생각하지만 적절한 해결책을 찾고 싶습니다.

DB 테이블에는 처리 속도를 높이기 위해 인덱스도 있습니다. XML은 매주 커지며 :) 마지막 XML의 모든 노트와 새로운 노트에 매번 conatins됩니다.

QUESTION? PHP에서 BIG ARRAYS를 빨리 구문 분석하는 방법은 무엇입니까? 이것에 대한 Judy Arrays입니까? 변수에서 DB의 모든 ID를 저장하는 것이 좋은 해결책입니까? - PHP는 한 번에 크게 될 수 있습니다.

+0

메모리가 충분하면 SimpleXML도 괜찮습니다. 데이터베이스 쿼리가 XML의 중복 ID를 탐지하기 만하면 SimpleXML을 사용하면 데이터베이스에 전혀 액세스 할 필요가 없다는 것을 의미합니다. 그냥 PHP를위한 충분한 RAM을 구성하십시오') : – halfer

+0

거대한 XML 문서를 몇 개의 간단한 파일 조작으로 관리 할 수 ​​있습니다. XML 파일이 끊임없이 커지면 언젠가 그 일에 대해 뭔가해야 할 것입니다. 한 달에 하나의 XML 파일이있을 수 있습니까? – halfer

+1

아니요, xml_parse()가 필요한만큼 정확하게 버퍼를 읽고 그 후에 정리할 수 있습니다. lookup을위한 연관 배열을 만들고있는 것처럼 보입니다. if (isset ($ ids-> id)))와 같이 더 빠른 검사를 위해'isset()'언어 구조를 사용합니다. 이게 정말로 빨리 달리는 데 도움이되는지 확신 할 수 없습니다. 어쩌면 [SplFixedArray] (http://php.net/splfixedarray)를 살펴 봐야 할 것입니다. –

답변

1

DMOZ database (2G xml)을 구문 분석 할 때 Java 솔루션 (SAX 파서)이 사용되었습니다. 우선 XML (RDF 형식)에서 MySQL 데이터베이스로 매우 큰 데이터 배열을 전송해야했습니다. PHP 솔루션이 6 시간 이상이 작업을 수행했습니다. 그러나 Java 솔루션은 15 분 후에 비슷한 작업을 수행했습니다. SAX 파서를 기반으로 Java 솔루션을 사용해보십시오.

+0

PHP에 [XML 파서와 유사한 SAX]가 있습니다. (http://php.net/manual/book.xml.php)뿐만 아니라 [libxml 기반 XML Reader] (http://php.net/manual/book.xmlreader.php)도 있습니다. 그냥 참고하시기 바랍니다. – hakre

1

아이템을 삽입하기 전에 DB에 아이템이 있는지 찾아야합니까? DB에 '존재하지 않으면 삽입하십시오'라고 말하면됩니다. ID에 고유 키를 입력하고 INSERT IGNORE을 사용하십시오.

+0

예, 필자가 새 메모를 삽입하고 메모가 새로운 경우 다른 테이블에 다른 행을 만들기 때문에 필요합니다. – Radek

관련 문제