큰 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는 한 번에 크게 될 수 있습니다.
메모리가 충분하면 SimpleXML도 괜찮습니다. 데이터베이스 쿼리가 XML의 중복 ID를 탐지하기 만하면 SimpleXML을 사용하면 데이터베이스에 전혀 액세스 할 필요가 없다는 것을 의미합니다. 그냥 PHP를위한 충분한 RAM을 구성하십시오') : – halfer
거대한 XML 문서를 몇 개의 간단한 파일 조작으로 관리 할 수 있습니다. XML 파일이 끊임없이 커지면 언젠가 그 일에 대해 뭔가해야 할 것입니다. 한 달에 하나의 XML 파일이있을 수 있습니까? – halfer
아니요, xml_parse()가 필요한만큼 정확하게 버퍼를 읽고 그 후에 정리할 수 있습니다. lookup을위한 연관 배열을 만들고있는 것처럼 보입니다. if (isset ($ ids-> id)))와 같이 더 빠른 검사를 위해'isset()'언어 구조를 사용합니다. 이게 정말로 빨리 달리는 데 도움이되는지 확신 할 수 없습니다. 어쩌면 [SplFixedArray] (http://php.net/splfixedarray)를 살펴 봐야 할 것입니다. –