2010-06-22 4 views
8

저는 정보를 꽤 자주, 예를 들어 초에 두 번씩 기록해야하는 어플리케이션을 작성하고 있습니다. 정보를 sqlite 데이터베이스에 저장하고 싶지만 디스크를 10 분마다 한 번 변경하면됩니다.메모리에서 파일로 sqlite 데이터베이스 동기화하기

파일 데이터베이스를 사용할 때 내 쿼리를 실행하면 시간이 오래 걸리고 컴퓨터가 지연됩니다.

옵션 솔루션은 인 - 메모리 데이터베이스를 사용하는 것이 가능

인가, (그것이 걱정 맞는 것), 수시로 디스크에 동기화? 달성하기위한 더 좋은 방법이 있습니까 (X 쿼리 후에 만 ​​디스크에 커밋하도록 sqlite에 지시 할 수 있습니까?).

QtSQL 래퍼로 해결할 수 있습니까?

답변

11

'events'라는 테이블이있는 'disk_logs'라는 디스크상의 데이터베이스가 있다고 가정합니다. 당신은 당신의 기존 데이터베이스 인 메모리 데이터베이스를 연결 수 : 다음

CREATE TABLE mem_logs.events(a, b, c); 

:

ATTACH DATABASE ':memory:' AS mem_logs; 

들어오는 로그 이벤트를 받기 위해서 (메모리 내 완전히 것) 해당 데이터베이스에서 테이블을 만듭니다

INSERT INTO disk_logs.events SELECT * FROM mem_logs.events; 

을 그리고 기존의 메모리 테이블의 내용을 삭제 : 애플리케이션 다운 타임시에 디스크 테이블에 메모리 테이블에서 데이터를 전송합니다. 반복.

이것은 꽤 복잡합니다 ... 레코드가 여러 테이블에 걸쳐 있고 외래 키와 함께 링크되어있는 경우 메모리 내 테이블에서 디스크 테이블로 복사 할 때 이러한 레코드를 동기화 상태로 유지하는 것이 어려울 수 있습니다 .

이렇게 (은 불편하게 이상 엔지니어링 된) 시도하기 전에 trying to make SQLite go as fast as possible을 제안 할 것입니다. SQLite는 초당 50,000 건 이상의 레코드 삽입을 쉽게 처리 할 수 ​​있어야합니다. 초당 두 번 로그 항목으로 인해 심각한 감속이 발생해서는 안됩니다.

2

SQLite 설명서를 간략하게 검색해도 아무런 도움이되지 않았습니다 (예상하지 못했지만 기대하지 못했습니다).

10 분마다 깨어있는 백그라운드 스레드를 사용하여 메모리 내 데이터베이스에서 외부 데이터베이스로 모든 로그 행을 복사하고 메모리 내 데이터베이스에서 삭제하십시오. 프로그램이 끝날 준비가되면, 마지막 로그를 저장하기 위해 백그라운드 스레드를 깨운 다음 ​​모든 연결을 닫으십시오.

+0

그러면 로그를 만들고, 로그의 어느 부분을 이미 저장했는지, 백그라운드 스레드를 유지하고, 주로 자신의 구현 동기화를 기억해야하기 때문입니다. 가능한 일이지만, 나는 그것을 피하고 싶습니다. –

+0

궁극적으로이 문제를 어떻게 해결하는지 알려주십시오. –

5

각 삽입물을 자체 트랜잭션으로 실행하는 경우보고있는 속도 저하에 크게 기여할 수 있습니다.아마 당신은 할 수 :

  • 는 N 레코드가
  • 를 삽입 한 경우/
  • 커밋 최종 거래를 계산하여 기록
  • 증가를 삽입 트랜잭션
  • 을 시작하기까지 삽입 된 레코드의 수를 계산
  • 반복

단점은 시스템 cr 그 기간 동안 유골은 un-committed 레코드를 잃어 버릴 위험이 있습니다 (하지만 메모리가있는 데이터베이스를 사용하고자한다면 위험하다고는 생각하지 않는 것보다).