2012-09-06 5 views
1

저는 Berkeley Db를 사용하는 응용 프로그램을 개발 중입니다. ACI (ACID는 아님)와 일치해야하며 성능이 매우 중요합니다. 그 이상으로 퍼포먼스가 제가 버클리 Db를 선택한 이유였습니다. 하지만 Berkeley Db는 로깅 때문에 병목 현상이있는 것 같습니다. 문제는 더 많은 데이터가 데이터베이스에 저장 될수록 더 오래 저장 될 값입니다. 나는__db.00x 파일에 기록/기록하지 않고 Berkeley Db 트랜잭션을 사용하는 방법?

envp->set_flags(envp, DB_TXN_NOSYNC, 1); 

을 확인하고 플래그와 환경 엽니 다

DB_CREATE  | // Create the environment if it does not exist 
    DB_INIT_TXN | // Initialize the transactional subsystem. 
    DB_INIT_MPOOL | // Initialize the memory pool (in-memory cache) 
    DB_INIT_LOCK | // Initialize the locking subsystem 
    DB_THREAD; 

을하지만 여전히 디스크에 로깅하고,의 performace는 데이터 양이 증가함에 따라, 매우 가난한 가져오고 값이되는 내 생각, 더 이상 얻을 저장, 시간의 대다수가 로그 파일로 저장에 소요됩니다 -로드 평균은

load average: 19.65, 19.12, 17.00 

내가에서 동기화 모든 로그를 필요로하지 않는 것입니다 런타임 - ACI는 필요하지만 ACID는 필요하지 않습니다.

로그 오프 켜거나 디스크에 쓰기 로그를 비활성화하는 방법이 있나요?

편집 : 누구도 대답하지 않았으므로 많은 검색을 해본 결과 way이 로깅을 해제했지만 불행히도 도움이되지 않았습니다 - 환경은 여전히 ​​__db.00x 파일에 많은 것을 씁니다. 왜 그리고 어떻게 메모리에 저장 하는지를 안다.

답변

0

fsync (2)를 비활성화하면 성능을 향상시킬 수 있습니다.

는 0을 반환하는 스텁 루틴을 쓰기 버클리 DB를 열 때 fsync를 벡터 을 설정합니다.