2012-09-17 4 views
0

나는 sqlite3을 실험하고있다. 스레드간에 공유되는 데이터의 모든 잠금 및 원 자성을 해결하기 위해 다중 스레드 응용 프로그램에서이 메서드를 사용하려고합니다. 속도를 높이기 위해 그리고 프로그램 실행 사이에 저장된 데이터가 필요 없기 때문에 대부분의 시간에 < 100 rows, 최악의 경우 < 500 행을 포함하는 메모리 내장 데이터베이스를 사용하려고합니다.sqlite가 "메모리 부족"이라고 말하는 이유는 무엇입니까?

저는 libsqlite3 버전 3.7.9-2ubuntu1.1을 사용하여 Ubuntu 12.04 x64에서 실행됩니다.

여기 내 코드의 다음 sqlite3_open 라인

#include <stdio.h> 
#include <sqlite3.h> 

int main(int argc, char *argv[]) { 
    sqlite3 *db; 
    char *zErrMsg = 0; 
    int rc; 

    rc = sqlite3_open_v2("file::memory:?cache=shared", &db, SQLITE_OPEN_FULLMUTEX, NULL); 

    /* This should never ever happen! */ 
    if (rc != SQLITE_OK) { 
     fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); 
     sqlite3_close(db); 
     return(1); 
    } 

    rc = sqlite3_exec(db, "CREATE TABLE Players (id int, ip varchar(15), x int, y int);", NULL, NULL, &zErrMsg); 
    if (rc != SQLITE_OK) { 
     fprintf(stderr, "SQL error: %s\n", zErrMsg); 
     sqlite3_free(zErrMsg); 
    } 

    sqlite3_close(db); 
    return 0; 
} 

, 나는 변화의 톤을 시도하고 나는 두 가지 문제가있다. 나는이 변화를 시도 할 때, 나는 아이러니하게도 "일어나지 말았어야"로 주석 절에 "아웃 메모리의"오류가 발생합니다 :

rc = sqlite3_open_v2("file::memory:?cache=shared", &db, SQLITE_OPEN_FULLMUTEX, NULL); 
rc = sqlite3_open_v2(":memory:", &db, SQLITE_OPEN_FULLMUTEX, NULL); 

나는이 단순한 라인을 시도하는 경우, 파일을 만들어 문서를 무시 "file :: memory :? cache = shared"라는 디스크에 :

rc = sqlite3_open("file::memory:?cache=shared", &db); 

내가 여기서 잘못하고있는 것은 무엇입니까?

답변

2

아마도 SQLITE_OPEN_READWRITESQLITE_OPEN_CREATE 플래그가 필요합니다.

URI 파일 이름을 사용하려면 SQLITE_OPEN_URI 플래그가 필요합니다.

1

SQLite3을 IPC 메커니즘으로 사용하는 것이 실용적인 것은 아닙니다. 소켓을 만들고 루프백 인터페이스를 사용하여 스레드간에 통신하는 것이 더 실용적으로 보일 것입니다. 또한 Windows 플랫폼에서 D 버스를 체크 아웃 할 필요가 없다면.

데이터베이스간에 스레드간에 정보를 공유하지 않습니다. 데이터베이스는 많은 양의 데이터를 저장하는 데 사용됩니다. 아마도 직렬화를 조사해야합니다.

protobuf은 C 또는 C++로 직렬화하기에 좋은 라이브러리입니다.

관련 문제