2012-04-10 2 views
0

나는 파일 (아마도 매우 큰 파일)을 파싱하고 각 엔티티를 다른 엔티티에 저장해야하는 프로젝트에서 작업하고 있습니다. 번들은 많은 파일 형식 (CSV, XML, JSON 등)을 처리합니다. 나는많은 양의 데이터를 객체에 저장하는 가장 좋은 방법

$em2 = $this->getDoctrine() 
     ->getEntityManager(); 

    foreach ($Parser as $key => $value) { 

     $str_or[] = new StringOrigin(); 
     $str_or[$key]->setSTORString($value); 
     /.. 
     $em2->persist($str_or[$key]); 
    } 

$em2->flush(); 

$ Paser 여기에 파일에서 구문 분석 된 문자열의 배열 문자열 배열을 반환 이러한 유형의 각 하나에 대한 파서를 만들려고하고있다. StringOrigin은 엔터티입니다. 얼마나 많은 데이터가 엔티티 관리자를 처리 할 수 ​​있습니까? 이 일을 올바르게하고 있습니까? 그렇지 않다면 bach processing 이 문제를 해결할 수 있습니까? 또한, DQL을 사용하지 않고 단 하나의 INSERT 만 수행 할 수있는 방법이 있습니까?

답변

0

Doctrine의 엔티티 관리자는 실제로 엄청난 수의 객체를 위해 설계되지 않았습니다. 내 경험상 수천 개의 레코드가 좋지만 수십만 개로 이동할 때 한계가 발생하기 시작합니다. 물론 그것은 엔티티의 복잡성에 달려 있습니다.

Doctrine의 데이터베이스 액세스 레이어 (DBAL)를 살펴보십시오. 기본적으로 :

$connection = $entityManager->getConnection(); 

데이터베이스에 직접 연결되는 얇은 랩핑 된 PDO 개체를 제공합니다. INSERT 문을 준비한 다음 다른 매개 변수로 계속 호출하십시오. 이렇게하면 한 번의 요청으로 수십만 개의 레코드를 처리 할 수 ​​있습니다. 그것보다 더 가야만하지 않았다.

그리고 데이터베이스 상호 작용을 수행하지 않고 파서를 테스트 해보십시오. 주의하지 않으면 PHP의 메모리 제한을 쉽게 맞출 수 있습니다.

+0

답변 해 주셔서 감사합니다. 파서로 더 많은 테스트를해야합니다. Prepared SQL 문을 사용하는 것이 좋지 않습니까? – Wissem

관련 문제