2012-07-30 5 views
4

안녕하세요, 나는 그것에 약 12,000 레코드 xml 파일이 있습니다. 작성된 코드가 있고 XML 파일을 구문 분석하고 내용을 반환하는 데 시간이 오래 걸립니다. 이 프로세스의 속도를 높이는 방법이 있습니까?xml PHP로 구문 분석

내 코드 :

<?php 
$dom = new DOMDocument(); 
$dom->load('comics.xml'); 
foreach ($dom->getElementsByTagName('record') as $entry) 
{ 
$title = $entry->getElementsByTagName('title')->item(0)->textContent; 
echo $title; 

} 
?> 

XML 파일 (거기 그냥 1 데모 캔트 롤 안에 모든 링크) :

<?xml version='1.0' encoding='utf-8'?> 
<calibredb> 
    <record> 
    <id>1</id> 
    <uuid>991639a0-7cf6-4a34-a863-4aab8ac2921d</uuid> 
    <publisher>Marvel Comics</publisher> 
    <size>6109716</size> 
    <title sort="Iron Man v1 101">Iron Man v1 101</title> 
    <authors sort="Unknown"> 
     <author>Unknown</author> 
    </authors> 
    <timestamp>2012-04-15T18:49:22-07:00</timestamp> 
    <pubdate>2012-04-15T18:49:22-07:00</pubdate> 
    <cover>M:/Comics/Unknown/Iron Man v1 101 (1)/cover.jpg</cover> 
    <formats> 
     <format>M:/Comics/Unknown/Iron Man v1 101 (1)/Iron Man v1 101 - Unknown.zip</format> 
    </formats> 
    </record> 
    </calibredb> 
+0

1 단계, 실제로 느린되고 있는지 알아 :

구글은 몇 가지 예를 가지고있다. 키워드 : 프로파일 링. – salathe

+0

xpath로 시도하고 결과를 비교할 수 있습니까? 나는 그것이 더 빠를 수 있다고 생각하지만, 전에 그것을 테스트 해본 적이 없다. – mrok

+0

[XML Parser] (http://www.php.net/manual/en/book.xml.php)를 사용하십시오. 데이터를 청크로 가져오고 수동으로 (이벤트 기반으로) 구문 분석해야하지만 DOMDocument 또는 SimpleXML (내부 트리가 생성되지 않고 메모리에 고정되어 있지 않음)보다 훨씬 효율적입니다. –

답변

1

대답은 데이터에 많이 의존한다. 가능한 솔루션은 MySQL과 같은 관계형 데이터베이스로 데이터를 이동하거나 데이터를 구문 분석하기 쉽고 공간을 덜 차지하며 한 줄씩 읽을 수있는 CSV와 같은 형식으로 표준화하는 것입니다.

+0

예 정보를 저장하는 것을 피할 수 있었으면합니다. 데이터베이스하지만 아마 내 최고의 솔루션이 될 것 같습니다. – rackemup420

+0

@ rackemup420 내 대답 좀 보셨어요? \ –

0

저는 PHP 구현에 익숙하지 않지만 Xerces를 사용하여 C++에서 다음과 같은 접근법을 사용했습니다. 시나리오에 대한 성능이 크게 향상되었습니다.

모든 요소를 ​​이름으로 요청하고 전체 NodeList가 반환되기를 기다리는 대신 루트 노드 아래 첫 번째 자식 노드를 얻은 다음 NextSibling 노드를 얻는 것이 훨씬 빠르다는 것을 알았습니다. 각 형제 노드를 새 노드로 사용하면 남은 노드가 없어 질 때까지 NextSibling을 계속 가져옵니다.

PHP에서 성능 향상이 C++에서와 비슷하게 이루어지기를 바랍니다.

2

DOM 모든 XML 구조가 구문 분석되어 메모리에 저장되기 때문에 작은 데이터 세트에 적합합니다.

대용량 XML 파일을 구문 분석 할 때 SAX 접근 방식을 사용해야합니다. XML 파일은 한 번에 한꺼번에 읽을 수 없으므로 한 줄씩 읽을 수 있습니다. https://www.google.lv/search?q=php+SAX+XML