2012-03-17 2 views
1

내게 정말 직관적이지 않은 이유는 무엇입니까? 나는 문서에서 유용한 것을 찾을 수 없다. 나는 매 50 회 반복마다 플러시를하고 있으며, 매 플래시 메모리 사용량이 1MB 씩 증가하고있다. 100 회 플러시는 100MB를 사용합니다! 내가 여기서 무엇을 놓치고 있니? Doctrine의 웹 사이트 예제에서 clear()로 보았습니다.하지만 사용하는 경우 객체 중 하나에 캐스케이드 지속 세트가 없다는 예외가 있습니다. 누구나 내가 할 수있는 일을 설명 할 수 있을까요? 그리고 모든 교리의 목적을 제대로 설정하지 못하게하려면 어떻게해야합니까?doctrine 2.1 : 플러시 후 메모리 사용량이 증가했습니다.

답변

3

문제는 엔티티 관리자가 모든 개체를 처리한다는 것입니다. 각 X 반복 후에 RAM에있는 객체가 필요 없다면 재설정해야합니다. 이 밖으로 시도 :

또한
// get the entity manager and save objects and flush 
$em = $this->get('doctrine')->getEntityManager(); 
... 
$em->flush(); 

// then reset the entity manager 
$this->get('doctrine')->resetEntityManager(); 
3

, 여기에 읽기 : http://docs.doctrine-project.org/en/2.0.x/reference/batch-processing.html

그것은 작업의 모든 대량 후 $ 보하기>를 명확()를 사용하는 제안합니다. (Besnik이 제시 한 것과 동일한 효과를 제공해야 함). 앞서 언급 한 링크에서

: 교리

대량 삽입이 가장 잘 의 EntityManager의 트랜잭션 쓰기 뒤에 행동 을 활용, 일괄 적으로 수행됩니다. 다음 코드는 일괄 처리 크기가 20 인 개체를 10000 개 삽입하는 예제입니다. 일괄 처리 크기로 실험해야만 가장 적합한 크기를 찾을 수 있습니다. 더 큰 배치 크기는 준비된 명령문 재사용을 내부적으로 의미하지만 플러시 중에는 더 많은 작업을 의미합니다 ( ).

0

레코드를 대량 삽입하는 경우 (100K 이상) 비슷한 상황이 발생했습니다. Rauni와 Besnik의 제안과 Doctrine의 일괄 처리 가이드를 따라 갔지만 $ em-> clear() 및 resetEntityManager() 후에도 메모리는 계속 증가했습니다.

ORM 도구를 대량 삽입, 업데이트 또는 삭제 주로 잘 적합하지 않다 : 며칠 후, 나는 교리의 문서에 대한 정보의 통지를 향했다. 모든 RDBMS에는 과 같은 작업을 처리하는 가장 효과적인 자체 방법이 있으며 아래에 설명 된 옵션이 충분하지 않은 경우 RDBMS 도구를 사용하여 이러한 대량 작업을 수행하는 것이 좋습니다.

원시 SQL (MySQL)을 사용하고 삽입을 일괄 처리합니다. 메모리 사용량은 원시 SQL을 사용하여 Doctrine을 사용하여 200MB 이상에서 30MB로 줄였습니다. 소스 배열에 삽입 할 요소를 팝하는 순간 메모리 사용량이 줄어들 수 있습니다. 220 초에서 20 초로 훨씬 빨라졌습니다.

관련 문제