2010-03-16 3 views
3

이론적으로 무제한의 저렴한 트랜잭션을 지원하는 C로 작성된 키 - 값 사전 라이브러리를 찾고 있습니다.COW 트랜잭션을 지원하는 C 사전을 알고 있습니까?

트랜잭션을 시작하는 스레드가 수백 개 있고 사전을 수정하거나 트랜잭션을 완료하거나 트랜잭션을 중단 할 수있는 사전을 메모리에 하나 갖고 싶습니다. 이러한 스레드가 사전을 실제로 수정하는 시간은 50 %에 불과합니다.

대부분의 사전 트랜잭션 구현은 트랜잭션이 시작될 때마다 항상 복사 대신 복사를 보았습니다. 사전의 예상 크기 (> 1GB)를 감안할 때, 트랜잭션 중에 실제로 무언가가 변경 될 때만 COW가되는 것을 찾으려고합니다. 나는 또한 대부분의 주요 GNU/리눅스 배포판에 의해 패키지 된 것을 기대하고있다.

모든 제안이나 링크는 매우 높이 평가됩니다.

답변

1

SQLite3은 거래 가능하며 전적으로 in memory 일 수 있습니다. 그것의 으로으로 싸구려일지도 모릅니다. 빠른 mlock()/mlockall()은 posix_madvise()를 사용하여 DB가 페이징되지 않도록 YMMV를 유지합니다. 상자 솔루션이 아니지만 적응하기가 너무 어렵지 않습니다.

BDB은 현재 Oracle이 판매하는 또 다른 옵션입니다.

SQLite3은 내 요구 사항에 거의 완벽하게 맞습니다. 이 질문을함으로써 내가 Tumbleweed badge을 얻은 것을 감안할 때, 내가 할 수있는 최소한의 대답은 대답입니다.

1

기본 사전 필요에 SQLite 과도 함이 필요하지 않습니까? 일반적으로 쿼리를 실행하지 않으면 데이터베이스의 오버 헤드가 필요하지 않습니다.

BDB는 확실히 훌륭합니다. 저는 잠시 동안 여러 프로젝트에이 프로젝트를 통합하려는 의도였습니다. 성능 향상으로 이익을 얻을 수있는 것처럼 보입니다.

가장 쉬운 해결책은 copy-on-write 비헤이비어를 구현 한 후 래퍼 객체의 stl :: map 또는 hash_map을 만드는 래퍼 클래스 (즉 COWString)를 만드는 것입니다. 그런 식으로 컨테이너 논리에서 COW 논리를 추상화하면 자신 만의 컨테이너 클래스와 거대한 복잡성을 작성할 필요가 없습니다.

+0

특히 정상적인 빠른 뮤텍 텍스트를 사용하여 수백 개의 스레드를 제어 할 수있는 트랜잭션을 제공합니다. 나는 많은 시간을 물건을 시험하는 데 썼다. SQLite는 내 집에서 쌓은 힙 프로파일에 가까워졌고 (대용량으로 말하면 어쨌든), 더 많은 유연성을 제공합니다. –

관련 문제