2009-10-08 2 views
22

Java 앱에서 사용할 디스크 기반 맵 구조가 필요합니다. 그것은 다음과 같은 기준이 있어야합니다빠르고 확장 성이 뛰어난 영구 맵 권장 - Java

기록의 수백만 (심지어 수십억)
  • 빠른 조회를 저장할 수있는
    1. - 키가 이미 존재하는 경우지도에 대한 작업의 대부분이 간단하게 볼 수 있습니다. 이것과 위의 1이 가장 중요한 기준입니다. 자주 사용되는 키에는 메모리 캐싱 메커니즘에 효과적이어야합니다.
    2. 지속성은 있지만 트랜잭션 일 필요는 없으며 일부 실패로 인해 생존 할 수 있습니다. 즉, 주기적으로 디스크와 동기화 할 수 있으며 트랜잭션 일 필요는 없습니다.
    3. 간단한 기본 유형을 저장할 수는 있지만 일련 화 된 객체는 저장할 필요가 없습니다.
    4. 배포 할 필요가 없습니다. 즉, 모든 컴퓨터에서 실행됩니다.
    5. 간편하게 &을 설정하십시오.
    6. 없음 관계형 쿼리는

    기록 키 문자열이나 걷고있을 것입니다 필요하지 않습니다. 전술 한 바와 같이, 판독은 쓰기보다 훨씬 더 빈번하며, 판독의 대부분은 단순히 키가 존재하는지 (즉, 키 관련 데이터를 판독 할 필요가 없는지)를 검사하는 것일 것이다. 각 레코드는 한 번만 업데이트되고 레코드는 삭제되지 않습니다.

    현재 Bdb JE를 사용하고 있지만 다른 옵션을 찾고 있습니다.


    업데이트

    보조 키에 대한 의존성을 줄여 기존 BDB 설정에 대한 향상된 쿼리 성능 때문에 되세요. 일부 쿼리는 두 개의 보조 키에 대한 조인을 필요로했으며이를 복합 키로 결합하여 룩업에서 간접적 인 수준을 제거했습니다.

  • +0

    내가 고려중인 한 가지 옵션은 기존 BDB 구현 방식을 변경하는 것입니다. 현재 모든 기록에 대해 하나의 큰 데이터베이스가 있습니다. 그러나 데이터를 세트로 분할하고 세트 당 하나의 데이터베이스를 가질 수 있어야합니다. 어떤 시점에서 특정 세트에만 액세스해야한다는 것을 알고 있으면 사용하지 않는 세트를 닫을 수 있습니다. bdb가 데이터를보다 효율적으로 관리하는 데 도움이됩니다. – Joel

    +0

    bdb je를 사용했습니다. 귀하의 기준에 따라, 그것은 매우 적합합니다. 그러나, 나는 그것의 허약함에 정말로 실망했고, 프로덕션 사용을 위해 그것을 추천하지 않을 것이다. 자바 프로세스의 어떤 문제로 인해 bdb 서브 시스템이 재시작, 블리치가 필요합니다! – james

    +0

    BDB JE의 "취약성"이 무슨 뜻인지 잘 모르겠습니다. BDB JE는 테라 바이트의 데이터까지 확장 가능하며 항상 프로덕션 시스템에서 사용합니다. 멋진 기술입니다. – jasonmp85

    답변

    3

    로컬 데이터베이스를 사용하고 있습니다. Bdb JE 또는 HSQLDB과 같이 말하세요. 이 접근 방식에 어떤 문제가 있는지 물어볼 수 있습니까? 대안을 찾아야 할 이유가 있어야합니다.

    댓글에 대한 응답 : 문제의 성능으로 저는 이미 JDBC를 사용하여 이것을 처리하고 있는데 HSQLB를 시도하고 Memory and Disk Use의 장을 읽는 것이 좋습니다.

    +1

    +1 동의합니다. 정규 DB를 사용하여 요구 사항에 맞는 좋은 API를 작성하여 백엔드를 쉽게 전환 할 수 있습니다. – flybywire

    +0

    일단 Bdb가 메모리에 캐시 될 수있는 한계에 도달하면 나는 그것이 받아 들일 수 없을 정도로 느려진다는 것을 발견하게됩니다. 이것은 일반적으로 약 1mm 삽입 후 발생합니다. – Joel

    +0

    HSQLDB는 어떻습니까? 두 JDBC를 모두 추측하여 기존 코드를 많이 수정하지 않고 슬롯에 넣을 수 있어야합니다. 읽을 가치가 있습니다 : http://hsqldb.org/doc/2.0/guide/deployment-chapt.html#deployment_mem_disk-sect –

    0

    나는 Hibernate Shards가 모든 요구 사항을 쉽게 충족시킬 수 있다고 생각합니다.

    1

    SQLite는 이것을 수행합니다. http://zentus.com/sqlitejdbc

    코멘트에서 언급했듯이 SQLite를 기가 바이트의 데이터와 수억 개의 행을 가진 테이블과 함께 성공적으로 사용했습니다. 색인 생성을 올바르게 생각하면 매우 빠릅니다.

    유일한 고통은 JDBC 인터페이스입니다. 간단한 HashMap에 비해, 그것은 clunky입니다. 필자는 종종 특정 프로젝트에 대한 JDBC 래퍼 (wrapper)를 작성하게되는데, 이는 많은 상용구 코드를 추가 할 수 있습니다.

    +0

    나는이 많은 레코드에 대해 sqlite가 확장 될지 심각하게 의심합니다. –

    +1

    저는 기가 바이트의 데이터와 수억 개의 행을 가진 테이블로 SQLite를 성공적으로 사용했습니다. 색인 생성을 올바르게 생각하면 매우 빠릅니다. –

    0

    JBoss (tree) Cache은 좋은 옵션입니다. JBoss에서 독립형으로 사용할 수 있습니다. 매우 견고하고, 효율적이며 유연합니다.

    +1

    지속성입니까? –

    6

    OrientDB을 살펴볼 수 있습니다.

    1

    Tokyo Cabinet은 간단한 영구 해시/맵으로 설정하고 사용하는 것이 빠릅니다.

    이 축약 된 예는, the docs에서 촬영, 그것은 지속적인지도 데이터를 저장하고 검색하는 방법을 간단하게 보여줍니다

    // create the object 
        HDB hdb = new HDB(); 
        // open the database 
        hdb.open("casket.tch", HDB.OWRITER | HDB.OCREAT); 
        // add item 
        hdb.put("foo", "hop"); 
        hdb.close(); 
    
    19

    JDBM3 당신이 찾고있는 정확하게한다. 정말 간단한 API와 고성능을 갖춘 디스크 백업 맵 라이브러리입니다.

    UPDATE

    이 프로젝트는 지금 MapDB으로 발전했습니다 http://www.mapdb.org

    6
    당신은 http://openhft.net/products/chronicle-map/ 크로니클지도에서 자바 연대기를 시도 할 수 있습니다

    는 높은 성능, 오프 힙 메모리에, 키 - 값, 지속하다 데이터 저장소. 그것은 표준 자바지도처럼 작동합니다

    +1

    이 링크가 질문에 대답 할 수 있지만 여기에 답변의 핵심 부분을 포함하고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않게 될 수 있습니다. – Cyclonecode

    +2

    @ krister - 나는 이것이 이상적인 질문보다 적은 질문이 SO의 정책을 위반 한 대답을 생성 한 경우라고 생각합니다. (대답은 그 질문에 답하는 데 도움이되었습니다.) 이 경우 나는 그 질문에 반대하는 경향이있다. – jww

    2

    오늘 현재 MapDB (파일 기반/백업 동기화 또는 비동기) 또는 Hazelcast을 사용합니다. 나중에 자바 인터페이스를 구현하여 RDBMS를 지원하는 자체 퍼시스턴스를 구현해야합니다. OpenHFT 크로니클은 다른 옵션 일 수 있습니다. 나는 결코 그것을 사용하지 않았기 때문에 얼마나 끈기가 거기에서 작동하는지 모르지만, 하나를 가지고 있다고 주장한다. OpenHFT는 완전히 힙이 없으므로 직렬화가없는 객체 (프리미티브)의 부분 업데이트를 허용하므로 성능상의 이점이 있습니다.

    참고 : 메모리 문제로 인해 맵 디스크가 필요한 경우 가장 쉬운 옵션은 MapDB입니다. Hazelcast는 시간 또는 크기 후에 힙에서 요소를 제거 할 수있는 캐시 (분산 또는 비공유)로 사용할 수 있습니다. OpenHFT는 힙을 사용하지 않기 때문에 jvm 재시작에 대한 지속성 만 있으면됩니다.

    관련 문제