2013-05-23 7 views
0

우리는 지속성을 위해 Data Nucleus 1.1.4/JDO 2.3을 사용하는 Java 웹 앱을 보유하고 있습니다.배치 JDO 삽입을위한 메모리 사용량 감소

많은 수의 JDO 객체를 한 번에 지속하는 일괄 가져 오기 작업이 있습니다. 우리는 가져올 데이터가 너무 커서 OutOfMemoryError가 던져지는 상황이있었습니다.

의도 한 패턴은 입력 스트림을 반복하고, 행을 구문 분석하고, JDO 객체를 인스턴스화하고, makePersistent를 호출 한 다음 JDO 객체에 대한 객체 참조를 해제하여 입력 데이터 크기에 관계없이 메모리 풋 프린트를 평평하게 유지합니다. .

이 작업 중에 힙 분석을 수행하면 commit이 발생할 때까지 JDO 개체 인스턴스가 쌓여서 많은 양의 메모리를 차지하는 것처럼 보입니다. 비록 우리가 그들에 대한 참조를 가지고 있지는 않지만 Data Nucleus의 PersistenceManagerTransaction 구현은 "더러운"JDO 객체 인스턴스 (실제로는 원본의 사본) 목록을 보유하는 org.datanucleus.ObjectManagerImpl 객체를 참조합니다. 아마 이것에 대한 합리적인 이유가있을 수 있지만 프레임 워크가 각 JDO 객체의 사본을 보유해야한다는 사실에 조금 놀랐습니다. 그것들은 커밋 후에 처리되지만 모든 삽입이 원자 적으로 이루어 지도록하려면 트랜잭션 내에서이 작업을 실행해야합니다. 현재 상태에서 메모리 사용량은 데이터 입력 크기와 선형 적으로 관련이 있습니다.이 경우 OutOfMemoryErrors가 열리게됩니다 (단 한 번의 작업이 아닌 동시 작업의 경우).

이와 같은 일괄 JDO 삽입 작업을 위해 플랫 메모리 풋 프린트에 가깝게 유지하는 데 유용한 팁이나 모범 사례가 있습니까?

+0

이 문제를 해결하는 방법을 모르겠지만 지속성 구성 속성 파일 내용이 실제로 도움이된다고 생각합니다. –

답변

0

가장 좋은 방법은 루프를 통해 PersistenceManager의 flush 메소드를 주기적으로 호출하는 것이 었습니다. 이로 인해 JDO 프레임 워크 (ObjectManagerImpl)가 객체를 놓을 수 있습니다.