2013-07-16 2 views
0

Java에서 CachedRowSetImpl 클래스를 사용하는 데 어려움이 있습니다. ~ 35,000,000 줄과 3 개의 정수 열을 포함하는 거대한 postgres 테이블의 데이터를 분석하려고합니다.Java 클래스 CachedRowSetImpl의 이상한 동작

나는 모든 것을 내 컴퓨터의 실제 메모리에로드 할 수 없다. 그런 다음 100000 라인의 배치 당이 라인을 읽고 싶다. psql 프롬프트 나 pgadmin과 같은 그래픽 인터페이스에서 해당 쿼리 (테이블 한도 10000에서 col1, col2, col3 선택)를 실행하면 100000 라인과 몇 메가 바이트의 메모리를로드하는 데 약 4000ms가 걸립니다.

나는 다음과 같은 자바 코드와 동일한 작업을 수행하려고 :

CachedRowSet rowset = new CachedRowSetImpl(); 
int pageSize=1000000; 
rowset.setCommand("select pk_lib_scaf_a,pk_lib_scaf_b,similarity_evalue from from_to_scaf"); 
rowset.setPageSize(pageSize); 
rowset.setReadOnly(true); 
rowset.setFetchSize(pageSize); 
rowset.setFetchDirection(ResultSet.FETCH_FORWARD); 
rowset.execute(myConnection); 

System.out.println("start !"); 

while (rowset.nextPage()) { 
    while (rowset.next()) { 
     //treatment of current data page 

    } // End of inner while 
    rowset.release(); 
} 

위의 코드를 실행, "시작!" 메시지가 콘솔에 표시되지 않으며 rowset.execute() 행에 실행이 멈춘 것 같습니다. 또한, 메모리 소비가 미쳐서 내 컴퓨터 실제 메모리 (8GB)의 한계에 도달합니다.

이상하게 들리지만, 프로그램이 pageSize 구성을 고려하지 않고 행 세트를 ~ 35,000,000 줄로 채우는 것처럼 보입니다.

누구나 java JDBC 및 postgres 드라이버와 같은 문제가 있습니까? 나는 무엇을 놓치나요?

POSTGRES 9.1 CachedRowSet 자바 독 (강조 내)에서 자바 JDK 1.7

답변

2

:

CachedRowSet 객체가에 대한 연결을 이용한다 것을 의미 분리 집합이며, 그 데이터 소스 만 잠깐 동안. 변경 사항을 기본 데이터 소스으로 전파하면서 행을 채우고 다시 채울 데이터를 읽는 동안 데이터 소스에 연결합니다. 나머지 시간에는 데이터가 수정되는 동안을 포함하여 CachedRowSet 개체의 연결이 끊어집니다. 귀하의 질문에서

:

프로그램이 pageSize가 구성

예, CachedRowSet가 35m를 검색합니다을 고려하지 않고 ~ 35,000,000 라인 행 집합을 채우기 위해 시도하는 것 같습니다

데이터베이스에서 행을 한 번에 가져온 다음 페이지 매김 및 기타 정의 된 속성을 적용합니다. 가능한 해결책은 작은 청크로 데이터를 처리하고 각 행에 플래그를 지정하여 처리 된 것으로 표시하는 것입니다.

이미 이런 종류의 문제를 처리하는 Pentaho과 같은 ETL 도구를 사용하는 것이 좋습니다.

+0

감사합니다. 점진적 커서를 사용해 주셔서 감사합니다. 하지만 기본 jdbc jdk에는 이러한 사례를 처리 할 수있는 것이 없습니까?내 검색이 실패했지만 일상적인 사용 사례처럼 보입니다. 어쨌든 감사합니다. – user2346654