2016-03-05 87 views
0

我正在使用Berkeley DB將數據永久存儲在我的程序中。我在我的SSD上測試過它,我的SSD速度爲1.4Gb/s寫入。我的程序測試數據庫的存儲速度如下所示(錯誤檢查被省略)。Berkeley DB商店太慢了

const char* db_dir="./.db"; 
const char* db_name = "node_test_0"; 

void mk_path(char* dest,const char* prefix,const char* db_name){ 
    memcpy(dest,prefix,strlen(prefix)); 
    dest[strlen(prefix)] = '/'; 
    memcpy(dest+strlen(prefix)+1,db_name,strlen(db_name)); 
    dest[strlen(prefix)+strlen(db_name)+1] = '\0'; 
    return; 
} 

int main() { 
    DB* b_db; 
    DB_ENV* dbenv; 
    int ret; 
    int flag = 0; 
    DBT key, data; 
    char* full_path = NULL; 
    if((ret = mkdir(db_dir,S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)) != 0){ 
     if(errno != EEXIST){ 
     } 
    } 
    full_path = (char*)malloc(strlen(db_dir) + strlen(db_name) + 2); 
    mk_path(full_path, db_dir, db_name); 
    if ((ret = db_env_create(&dbenv, 0)) != 0) { 
     dbenv->err(dbenv, ret, "Environment Created: %s", db_dir); 
    } 
    if ((ret = dbenv->open(dbenv, db_dir, DB_CREATE|DB_INIT_CDB|DB_INIT_MPOOL|DB_THREAD, 0)) != 0) { 
    } 

    if((ret = db_create(&b_db,dbenv,flag)) != 0){ 
    } 

    if((ret = b_db->open(b_db, NULL, db_name, NULL, DB_BTREE, DB_THREAD|DB_CREATE,0)) != 0){ 

    } 

    struct timeval start_time; 
    struct timeval end_time; 
    unsigned long e_usec; 

    memset(&key, 0, sizeof(key)); 
    memset(&data, 0, sizeof(data)); 
    key.data = "fruit"; 
    key.size = sizeof("fruit"); 
    data.data = "apple"; 
    data.size = sizeof("apple"); 

    gettimeofday(&start_time, NULL); 
    ret = b_db->put(b_db, NULL, &key, &data, 0); 
    gettimeofday(&end_time, NULL); 
    e_usec = ((end_time.tv_sec * 1000000) + end_time.tv_usec) - ((start_time.tv_sec * 1000000) + start_time.tv_usec); 
    printf("%lu\n", e_usec); 

    if (ret == 0) 
     printf("db: %s: key stored.\n", (char *)key.data); 
    else { 
     b_db->err(b_db, ret, "DB->put"); 
    } 

    return 0; 
} 

結果約爲23微秒。這比我預期的要慢得多。有沒有人有這個想法?我可以做什麼來使我的永久性存儲與寫入SSD一樣快。

+0

保存到一個文件將永遠不會像將原始數據直接寫入磁盤一樣快。最重要的是,數據庫至少在文件的頂部添加了一層抽象層,因此使用數據庫也比將原始數據直接存儲到文件要慢。 –

回答

0

BerkeleyDB在寫入之後執行fsync以確保磁盤上的數據已保存。如果您願意忍受可能發生災難性數據丟失的後果(這對於使用BDB的臨時非持久性數據存儲是可接受的),則可以將fsync(2)向量(僅返回0)剔除。