2011-09-27 5 views
5

Java를 사용하여 성장하고 성장할 수있는 가능성이있는 크기의지도를 만들고 싶습니다. 이제 분명히 표준 POJO HashMap을 사용하여 메모리가 부족 해지고 JVM이 중단됩니다. 그래서 Map의 라인을 따라 생각하면서, 메모리가 부족하다는 것을 알게되면 현재 내용을 디스크에 쓸 수 있습니다.Java에서 매우 큰지도 만들기

누구나 이와 비슷한 것을 구현했거나 기존 솔루션을 알고 있습니까?

내가하려고하는 것은 한 번에 한 줄씩 매우 큰 ASCII 파일 (예 : 50Gb)을 읽는 것입니다. 각 행은 키와 값을 포함합니다. 파일에서 키를 복제 할 수 있습니다. 그런 다음 각 행을 값 목록의 키인 Map에 저장합니다. 이지도는 성장하고 성장할 객체입니다.

큰 호응을 얻었습니다.

업데이트 : 모든 의견과 조언 모두를위한

감사합니다. 필자가 설명한 문제로 인해 데이터베이스는 정확하고 확장 가능한 솔루션입니다. 이 임시 맵은 파일 구문 분석을 돕기 위해 짧은 시간 동안 생성하고 사용해야하는 임시 맵이라는 것을 설명 했어야합니다. 이 경우 Michael이 "실제 값 대신 줄 번호 만 저장"하는 것이 가장 적절합니다. Michael의 대답을 권장 해결책으로 표시하십시오.

+3

HSQL과 같은 메모리 내장 데이터베이스를 사용하는 것이 더 간단하지 않습니까? – mcfinnigan

+0

매핑 할 키/값 유형은 무엇입니까? –

+0

저는 데이터베이스 접근 방식에 열중하지 않습니다. 너무 무거워. – Phil

답변

12

나는 데이터베이스를 찾고 있다고 생각합니다.

+0

:) 저는 데이터베이스를 고려했지만 오버플로 할 수있는 매우 간단한 (Map과 같은) 것을 원했습니다. 필요에 따라 디스크. 문제가 키가 존재하는지 어떻게 알 수 있습니까? 그래서지도의 "값"부분을 오버플로해야합니다. – Phil

+0

가능한 해결책 :지도를 사용하지만 실제 값 대신 줄 번호 만 값으로 저장합니다. 행 번호를 사용하여 파일에서 실제 값을 검색 할 수 있습니다. – michael667

+0

Michael - 이걸 생각하고 RandomAccessFile 판독기를 사용하여 읽었습니다. BufferedReader는 파일에서 현재 읽기 위치를 제공 할 수 없습니다. BufferedReader를 잃는 것은 readLine 기능을 잃는 것을 의미하며 내 CSV 구문 분석도 엉망으로 만듭니다 (원래의 질문에서 빠뜨린 이유는 그다지 중요하지 않았기 때문입니다). – Phil

2

거대한 파일을 DB에 덤핑하는 것과 같습니다.

음, 나는 이와 같은 상황이있었습니다. 하지만, 내 경우에는 모든 것이 TXT 파일 형식이고 파일 전체에 동일한 형식의 행이 있습니다. 그래서, 내가 한 것은 파일을 여러 조각으로 분할 한 것입니다 (아마도 JVM이 최대 크기를 처리 할 수있는 가능성이 있습니다). 그런 다음 파일을 하나씩 호출하여 처리되었습니다.

또 다른 방법으로 직접 데이터를 데이터베이스에 직접로드 할 수 있습니다.

0

(요청에 대한 임의 액세스가 아닌) 데이터 처리를 위해 맵을 구축하려는 경우 데이터베이스로 작업 할 필요없이 MapReduce이 원하는 것일 수 있습니다.

편집 : 많은 MapReduce는 많은 노드를 실행할 수있는 기능에 초점을 맞추지 만 모든 컴퓨터의 메모리에 모든 데이터를 저장해야하는 필요성을 피할 수 있습니다.

0

얼마나 많은 메모리가 있습니까? 메모리에있는 대부분의 데이터가 너무 느린 상태로 유지되지 않는 한, 실패했을 수도 있습니다. 무겁게 페이징하는 프로그램은 1000 배 느려질 수 있습니다. 일부 PC는 16-24 GB이며 더 많은 메모리를 확보 할 수 있습니다.

충분한 중복이 있다고 가정하면 대부분의 데이터를 메모리에 보관할 수 있습니다. 나는 당신이 ASCII 데이터를 가지고 있고 당신의 값을 다른 "String"타입 (구분 기호로)으로 저장하기 때문에 당신이 만든 바이트 기반의 String 클래스를 사용할 것을 제안한다. 당신은 작업 데이터 세트를 메모리에 유지할 수있다.

+0

더 가벼운'String' 라우트를 사용한다면,''MutableString' '(http://dsiutils.dsi.unimi.it/docs/it/unimi/dsi/lang/MutableString .html) 클래스는 부분적으로 이러한 목적으로 설계되었습니다. –

+0

MutableString은 char []를 사용합니다. Even String은 새로운 JVM에서 기본값 인 바이트 []'-XX : + UseCompressedStrings'를 사용하여 ascii 문자열을 변환 할 수 있습니다. 그러나 당신만큼 효율적이지는 않습니다. –

2

진지하게, 권고 된대로 간단한 데이터베이스를 선택하십시오. 오버 헤드가 아닙니다. — JPA 또는 기타 등등을 사용할 필요가 없습니다. 원시 SQL을 사용하는 일반 JDBC입니다.예를 들어, Derby 또는 HSQL은 임베디드 모드에서 실행할 수 있으므로 사용자, 액세스 권한을 정의 할 필요가 없으며 서버를 별도로 시작할 수 있습니다.

"오버 헤드"는 해시 맵 솔루션에 뛰어 들어서 OutOfMemoryException을 피하기위한 또 다른 최적화가 필요하거나 파일이 50GB가 아니라 75 ... 정말로, 가지 마라.

3

NoSQL 데이터베이스는 설치가 쉽고 맵과 비슷합니다. Oracle에서 BerkeleyDB Java Edition을 지금 확인하십시오. 지도와 같은 인터페이스가 포함되어 있으므로 복잡한 설정이 필요하지 않습니다.

+0

+1 메모리 데이터베이스 옵션. – FloppyDisk

0

BerkleyDB는 맵보다 복잡하지만 필자는이 맵 래퍼를 사용하여 실제로는 권장하지는 않지만 간단한 응용 프로그램을 아무것도하지만)

http://www.oracle.com/technetwork/database/berkeleydb/overview/index.html

은 메이븐 형태로도 주문 가능합니다 http://www.oracle.com/technetwork/database/berkeleydb/downloads/maven-087630.html

<dependencies> 
    <dependency> 
     <groupId>com.sleepycat</groupId> 
     <artifactId>je</artifactId> 
     <version>3.3.75</version> 
    </dependency> 
    </dependencies> 

    <repositories> 
    <repository> 
     <id>oracleReleases</id> 
     <name>Oracle Released Java Packages</name> 
     <url>http://download.oracle.com/maven</url> 
     <layout>default</layout> 
    </repository> 
    </repositories> 

또한 벤더 종속의 다른 하나의 단점이 (당신이 있습니다 즉,이 이 도구를 사용하기를 바랍니다. 다른 데이터베이스에 대한 다른지도 래퍼가있을 수도 있음)

귀하의 필요에 따라 선택하십시오.

0

대부분의 캐시 API는지도처럼 작동하며 디스크로 오버플로를 지원합니다. 예를 들어 Ehcache은이를 지원합니다. 또는 this tutorial for guave을 따르십시오.

관련 문제