2013-10-18 2 views
1

큰 XML 파일, 2,1gb 이상을 분석해야합니다.PHP가 포함 된 Xmlreader movetoelement

나는 PHP, Xmlreader 및 자동화 작업을 수행하여 매일 업데이트를 수행합니다.

내 서버가 제한되어 있고 자동화 된 작업이 1 시간 동안 제한됩니다.

1 시간 안에 2,1gb는 불가능하며 잠시 내 서버를 변경할 수 없습니다.

그래서 데이터베이스에 제품의 마지막 번호를 기록하고 두 번째 업데이트가 나타나면 다음 번에 xmlreader가 마지막으로 읽은 레코드와 비교합니다. 번호가 동일하면 업데이트 (PHP 왜곡)로 진행합니다. 다음 노드로 이동하고 마지막 번호를 기다립니다.

업데이트 된 노드의 마지막 번호로 더 빠르고 쉽게 이동하기 위해 두 번째 업데이트를 할 수 있습니까?

실제 시스템 작동하지만 파일을 읽고 마지막 제품 번호 저장을 찾으려면 시간이 필요합니다.

저는 영어를 잘 말하지 않으므로 이해할 것으로 기대합니다.

XML 파일의 일부 :

가 어떻게 직접 제품 ID 3에 갈 수 : PHP에서 분석

<?xml version="1.0" encoding="utf-8"?> 

<PRODUITS> 

    <PRODUIT id="1"> 

    <CAPACITE>4</CAPACITE> 

    <LOGEMENT><![CDATA[Résidence]]></LOGEMENT> 

    <HEBERGEMENT><![CDATA[Studio 4 personnes]]></HEBERGEMENT> 

    <REGION><![CDATA[Alpes du Nord]]></REGION> 

    <PAYS><![CDATA[France]]></PAYS> 

    <CODEPOSTAL>73500</CODEPOSTAL> 
    </PRODUIT> 

    <PRODUIT id="2"> 

    <CAPACITE>4</CAPACITE> 

    <LOGEMENT><![CDATA[Résidence]]></LOGEMENT> 

    <HEBERGEMENT><![CDATA[Studio 4 personnes]]></HEBERGEMENT> 

    <REGION><![CDATA[Alpes du Nord]]></REGION> 

    <PAYS><![CDATA[France]]></PAYS> 

    <CODEPOSTAL>73500</CODEPOSTAL> 
    </PRODUIT> 

    <PRODUIT id="3"> 

    <CAPACITE>4</CAPACITE> 

    <LOGEMENT><![CDATA[Résidence]]></LOGEMENT> 

    <HEBERGEMENT><![CDATA[Studio 4 personnes]]></HEBERGEMENT> 

    <REGION><![CDATA[Alpes du Nord]]></REGION> 

    <PAYS><![CDATA[France]]></PAYS> 

    <CODEPOSTAL>73500</CODEPOSTAL> 
    </PRODUIT> 
</PRODUITS> 

내 시스템?

<?php 
if(file_exists("$file_xml")) 
{ 
    $reader = new XMLReader(); 
    $reader->open("$file_xml"); 

    while($reader->read()) 
    { 
    if(($reader->name === 'PRODUIT') && ($reader->nodeType==XMLReader::ELEMENT)) 
    { 
    $node = new SimpleXMLElement($reader->readOuterXML()); 


    $id= mysql_real_escape_string(utf8_decode($node['id'])); 

      // For the next update but TAKE TIME !! 
      if(($num!="3")) 
     { 
     // Nothing to do 
      } 
     else 
     { 
     $num = mysql_real_escape_string(utf8_decode($node['num'])); 
      ....       
     } 
    } 
    } 
$reader->close(); 
} 
사전에

?>

감사합니다!

답변

0

나는 XMLReader를 내 스스로 고민하고 있지만, 이것은

if(($reader->nodeType==XMLReader::ELEMENT) && ($reader->name === 'PRODUIT')) 
{ 
    if($reader->getAttribute('id') === 3){ 
    //id is 3 
    } 
} 
작동합니다