2011-11-09 2 views
0

짧은 문자열 (50 자 이상)을 저장하고 빨리 찾아야합니다. 처음에는 SQLite를 사용하기를 원했습니다. 하나의 색인 된 TEXT 열이있는 단일 테이블을 만들었습니다. 모든 종류의 저수준 기술을 사용하여 10 초 만에 1 백만 개의 문자열로 데이터베이스를 채울 수있었습니다.키 - 값 데이터베이스

PC가 재부팅되면 10.000 행을 추가하는 데 30 초가 걸렸습니다.이 행은 10 초에 1M 행에 맞지 않습니다. 그 이유는 SQLite가 새로운 행을 추가하기 전에 기존 인덱스의 매우 큰 부분을 디스크에서 읽어야하기 때문입니다. 또 다른 문제점은 b- 트리 메커니즘 때문에 모든 문자열이 두 번 (일반 테이블에서 한 번, 인덱스 테이블에서 한 번) 저장되기 때문에 데이터베이스가 두 배로 커집니다.

간단한 대안이 있습니까? 예를 들어 해시 기반 조회를 사용합니까? 다양한 NoSQL 솔루션에 대해 알고 있지만 분산 된 저장소와 분산 된 저장소에 초점을 맞추고 있으며 단순한 임베드 된 '플랫 파일'데이터베이스가 필요합니까?

+0

색인과 관련하여 얻지 못하겠습니까? 키와 값과 같은 값을 사용하고 있습니까? – jgauffin

+0

임베디드 데이터베이스를 원하는 마녀 언어/플랫폼을 지정해야합니다. – jgauffin

+0

인덱스와 값이 같은 값을 사용하면 인덱스가 전혀 쓸모가 없습니다. – jgauffin

답변

0

디스크에 최신 값을 유지하는 것이 얼마나 중요합니까?

사전 또는 목록과 같은 메모리 내 모음을 사용하고 정기적 인 간격으로 비동기 호출로 로컬 파일에 serializing it까지 디스크에 유지할 수 있습니다.

응용 프로그램이 시작되면 다시 메모리로 역 직렬화 할 수 있습니다.

이것은 읽기/쓰기 작업으로 항상 디스크를 망치질 않아야하기 때문에 당신이 원하는 것을 성취하는 훨씬 더 반응적인 방법입니다.

+0

데이터를 SQLite에 삽입하기 전에 이미 데이터가 사전에 있으므로 구현하기가 쉽습니다. 하지만 그것을 다시 메모리로 비 직렬화하면 디스크에서 전체 파일을 읽어야합니다 (내가 틀렸다면 수정하십시오). 그것은 많은 작은 무작위 읽기 대신 하나의 긴 순차적 읽기 때문에 SQLite보다 빠를 수 있습니다. 그러나 그것은 내가 찾고있는 것이 아니며 모든 이전 기록을 읽지 않고 삽입을 수행 할 수 있습니다. – Muis

+0

일반 텍스트 파일에 추가하는 방법은 어떻습니까? –

+0

그것은 문제를 바꿀 것입니다 : 텍스트 파일을 사용하여 이전 레코드를 읽지 않고 삽입 할 수 있지만 단일 키를 찾으려면 해시/키를 변환 할 수 없으므로 평균 50 %의 파일을 읽어야합니다. 해당 파일 내의 위치로 이동합니다. 두 번째 파일을 만들 수 있는데, 여기서는 해시 값을 파일 오프셋에 매핑합니다. 그러나 essentialy는 휠을 다시 발명합니다 :) – Muis

관련 문제