2014-09-11 3 views
0

많은 질문을 확인했지만 답변을 얻지 못했습니다.큰 XML 파일 구문 분석

구문 분석 할 큰 XML 파일이 있습니다. 현재 XMLReader으로 구문 분석 중입니다. SQL db에 삽입하기 전까지는 효과가있었습니다. 난 단지 XML을 구문 분석하는 경우 잘 작동합니다, 내가 그것을 삽입하는 경우 504 게이트웨이 제한 시간 오류가 발생합니다.

$xml = new XMLReader(); 
$xml->open(APP_PATH_OWA."/trnUpload/TRNavteraData.xml"); 

while($xml->read()){ 
//get products 
if($xml->nodeType == XMLREADER::ELEMENT && $xml->localName == 'table'){  
    $product = array(); 
} 

if($xml->nodeType == XMLREADER::ELEMENT && $xml->localName == 'ident'){ 
    $xml->read(); 
    $product['id'] = $xml->value; 
} 
    ... 

의 Foreach : 나는 XML 파싱

:

foreach($products as $product){ 
    ... 
$productTitle = $product['title']; 
$productID = $product['id']; 
$productImageUrl = "http://www.example.com/logo.png"; 
$productAttrHtml = $product['computed']; 

// after that I'm inserting those data using ZEND framework. 

XML 파일에 대한 300K + 라인입니다 여기에 내 코드의 샘플입니다.

항목 PHP 함수 : http://pastebin.com/S8A5Rdjw

+0

DB에 물건을 삽입하기 시작할 때 문제가 발생 했으므로 코드의 해당 부분을 공유하는 것이 재미있을 수 있습니다. DB 프로세스 없이는 얼마나 걸리나요? – Sugar

+0

Im를 최소로 공유하면 DB 프로세스가 필요하지 않으므로 오래 걸리지 않습니다. 그리고 한 가지 더 생각했습니다. 504 Gateway Time-Out을 얻은 후에는 사이트의 일부에 액세스 할 수 없으며 전체 서버 시간 초과는 생각합니다. 몇 분 (15-20) 서버가 정상적으로 실행되고 XML의 기사가 db에 저장됩니다. http://pastebin.com/S8A5Rdjw - 여기 내 기능입니다. –

+0

Apache 또는 NGINX를 사용하고 있습니까? php 제한 시간을 늘려 보았습니까? 그렇지 않다면 스크립트 상단에'set_time_limit (0);'을 넣으십시오. – CrazySabbath

답변

1

메모리 소비를 감소하지만 런타임을 증가 프로세스 직렬화. 하지만 시간이 문제라고 생각하지 않습니다.

많은 삽입 문을 사용하여 데이터베이스 (테이블)에 대한 액세스를 차단할 수 있습니다.

몇 가지 팁 : 작업의 종류는 프레임 워크에 의해 지원되지 않는 경우

  1. 데이터베이스 수입을위한 프레임 워크를 사용하여 정말 느려질 수 있습니다. 이를 위해 데이터베이스 추상화를 피하십시오.

  2. 대량 삽입물을 사용해야합니다. 대부분의 데이터베이스는 한 번에 여러 레코드를 삽입 할 수 있습니다. 이렇게하면 데이터베이스 호출이 줄어 듭니다. (물론 필요한 메모리를 늘리면 균형을 찾아야합니다.)

  3. 삽입이 선택을 차단하지 않는지 확인하십시오. 데이터베이스에 따라 다르며 MySQL의 경우 테이블 핸들러에 따라 다릅니다.

  4. 별도의 테이블에 삽입하고 그 후에 테이블의 이름을 변경하십시오.

  5. 파일을 생성하고 데이터베이스 명령 행 클라이언트를 사용하여 파일을 가져 오십시오.