2012-06-26 2 views
0

FILE :
그것에 대해 다양한 데이터를 하나의 쿼리를 닮은 포함하는 각 라인의 데이터 3.3mio 라인을 포함하는 searchlog 파일의 세련된 CSV 버전으로 일하고 있어요 질문. 파일의 항목은 session/userid에 의해 오름차순으로 정렬됩니다.자바 큰 목록 방식

목표 : 동일한 사용자 ID에 속하는 반면 같은 queryterm를 제출
커플 링 항목

접근 방식 :
내가 selfmade에 데이터를 저장, 라인으로 CSV 파일 라인을 읽고 있어요 ' Entry'-object를 작성하여 arraylist에 추가하십시오. 이 작업을 수행 할 때, 나는 사용자 정의 비교하여 두 가지 기준으로 목록을 정렬 할 수 있습니다

문제 :

라인을 읽고 (이 매우 오래 걸립니다)이 목록에 엔트리 객체를 추가하는 동안 프로그램은에서 OutOfMemoryException "Java 힙"


그래서 내 접근 메모리 (런타임)에 너무 어려운 것 같다으로 종료됩니다.
더 나은 방법에 대한 아이디어가 있습니까?

+1

[sort] (http://ss64.com/bash/sort.html), 먼저 queryterm에 의해, 다음으로 userid로. –

+0

@MattBall 좋습니다. 그러나 일부 사용자는 bash 쉘을 사용할 수 없습니다. –

답변

2

접근 방법 자체가 유효 할 수 있으며 가장 간단한 해결책은 단순히 JVM에서 사용할 수있는 메모리를 늘리는 것입니다.

JVM은 최대량의 시스템 메모리 만 할당하므로 -Xmx 명령 줄 속성을 통해이 값을 늘릴 수 있습니다. 자세한 내용은 here을 참조하십시오.

분명히이 솔루션은 확장되지 않으며 훨씬 더 큰 파일을 읽고 싶다면이 파일을 읽는 더 좋은 해결책이 필요할 것입니다.

1

메모리에서 행을 정렬하는 대신, 중복을 정의하는 열을 기반으로 인덱스가있는 데이터베이스에 구문 분석 된 행을 삽입 할 수 있습니다.

또 다른 접근법은 여러 파일에 행을 발송하는 것입니다. 예를 들어, 각 파일의 이름은 이중화를 정의하는 결합 된 열의 첫 번째 2 자로 지정됩니다. 따라서 모든 복제본이 함께 있기 때문에 궁극적 인 운영을 위해 하나 이상의 파일을 읽을 필요가 없습니다.