2013-02-28 2 views
4

ID (현재는 행 번호)로 1,000 만 개의 제목을 색인화하려고하는데 제목이 토큰 화 된 후에 저장됩니다. 데이터 구조는 <String, Arraylist<Integer>>.과 같아야합니다. 문자열은 토큰을 나타내고, 정수는 행 번호를 나타냅니다.B- 트리를 사용하여 <String, Arraylist <Integer>>

가능한 한 RDBMS를 사용하지 않는 Java, 영구 메모리를 사용하여이 도구를 빌드해야합니다. 이 데이터 구조가 변경 가능하기 때문에 BTree 또는 다른 영구 데이터 구조를 사용하여 인덱싱 할 구조>로 MultiMaps를 지원하는 도구를 찾을 수 없습니다.

나는 MapDB을 시도,하지만 내 경우에는 (ArrayList에)

어떤 생각이 될것이다을 적용하지 않는, 불변 받아졌다.

+0

어떤 [구아바 Multimap과 내지 약 (http://guava-libraries.googlecode.com/svn/tags/release03/javadoc/com/google/common/collect/Multimap. HTML)? –

+0

Guava Multimap이 메모리 내장 스토리지 인 것 같습니다. – EurikaIam

+0

"지속적 메모리"- 잠깐만, 데이터를 메모리에 저장 하시겠습니까? 아니면 영구 저장 하시겠습니까? (즉, 디스크에 저장됩니다.) 메모리에있는 경우, 단지'HashMap'을 사용하십시오. 디스크에 있다면 BTree가 올바른 선택이지만, RDBMS가 아닌 라이브러리를 얻을 수 있을지는 의문입니다. ("BTrees를 디스크에 쓰는 것"으로 보는 것은 RDBMS에 대한 좋은 설명입니다.) – millimoose

답변

1

필요한 것을 멀티 맵이라고합니다. MapDB는 그것들을 직접적으로 지원하지 않지만, 거의 비슷하게 좋은 합성 집합을 가지고 있습니다.

예는 여기 : https://github.com/jankotek/MapDB/blob/release-1.0/src/test/java/examples/MultiMap.java

+0

안녕하세요. 당신이 제안한 것을 시도했습니다. 유일한 문제는 결과 색인의 크기입니다. ID가있는 19,177,268 개의 토큰에 대해 591.1MB 이것은 아직 색인에 추가되지 않은 전체 토큰의 10 %에 불과합니다. NavigableSet을 사용했습니다. > map1 = db.getTreeSet ("test"); 색인의 크기를 어떤 방식 으로든 줄일 수 있다고 생각하십니까? 또는 Java에서 직렬화의 본질입니까? – EurikaIam

+0

db.compact()를 호출하여 스토리지 조각 모음을 수행했는지 확인하십시오. 또한 우리는 튜플을위한 델타 패킹을 구현할 계획이며, 이는 인덱스 크기를 크게 줄입니다 (곧 암시 될 것입니다) –

관련 문제