Berkeley DB 商店太慢了

Posted

技术标签:

【中文标题】Berkeley DB 商店太慢了【英文标题】:Berkeley DB store is so slow 【发布时间】:2016-03-05 07:21:50 【问题描述】:

我正在使用 Berkeley DB 将数据持久地存储在我的程序中。我在我的 SSD 上对其进行了测试,我的 SSD 写入速度为 1.4Gb/s。我测试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 一样快。

【问题讨论】:

保存到文件永远不会像将原始数据直接写入磁盘一样快。最重要的是,数据库在文件之上至少添加了一层抽象,因此使用数据库也比将原始数据直接存储到文件要慢。 【参考方案1】:

BerkeleyDB 在写入后执行 fsync 以确保保存磁盘上的数据。如果您愿意承受可能发生的灾难性数据丢失的后果(这对于使用 BDB 的临时、非持久性数据存储是可以接受的),您可以将 fsync(2) 向量存根(仅返回 0)

【讨论】:

以上是关于Berkeley DB 商店太慢了的主要内容,如果未能解决你的问题,请参考以下文章

在 Berkeley DB Core 和 Berkeley DB JE 之间进行选择

Berkeley DB为啥又叫做db4

berkeley-db-je 的最新版本是啥?

berkeley db java edition怎样存储数据库?

[转] berkeley db aosa阅读

我可以使用 oracle berkeley db java edition 的 c 实现(python bsddb)创建的 bdb(berkeley db)文件吗?