如何在 Berkeley DB 中使用批量功能?

Posted

技术标签:

【中文标题】如何在 Berkeley DB 中使用批量功能?【英文标题】:How to use bulk feature in Berkeley DB? 【发布时间】:2011-01-27 09:46:34 【问题描述】:

目前我正在使用 Berkeley DB 并尝试了解内置的 C++ 批量功能。问题是我不知道如何使用此功能。没有 C++ 示例(只有那些臃肿的 C 示例)或我可以用来理解它的单元测试。

我特别想使用 DbMultipleKeyDataBuilder,它应该填充来自 std::map 的数据。

我应该如何初始化 DbMultipleKeyDataBuilder 的构造函数参数? Db::put 方法的 data 参数会发生什么?它应该是空的还是NULL?

如果有人成功使用过这些类,能否提供一些小例子?

提前致谢。

问候, 马丁

编辑:

好的,到目前为止我有以下代码

void
Storage::bulkInsert(
        TransactionI& txn,
        const Entries& entries) const

    if(entries.size() <= 0)
        return;

    char buffer[1024];
    memset(buffer, 0, 1024);
    Dbt multipleDbts;
    multipleDbts.set_ulen(1024 * sizeof(char));
    multipleDbts.set_data(&buffer);
    multipleDbts.set_flags(DB_DBT_USERMEM | DB_DBT_BULK);

    DbMultipleKeyDataBuilder keyDataBuilder(multipleDbts);

    Dbt dbtKey;
    Dbt dbtValue;

    for(typename Entries::const_iterator iter = entries.begin();
            iter != entries.end(); ++iter)
    
        uint64_t tmpKey = iter->first;
        const std::string& tmpValue = iter->second;
        keyDataBuilder.append(
                &tmpKey, sizeof(uint64_t),
                const_cast<char*>(tmpValue.c_str()), tmpValue.length()+1);
    
    this->getDbHandle().put(txn.getDbTxn(), &multipleDbts, 0, DB_MULTIPLE_KEY);

但是 Dbt multipleDbts 的缓冲区呢?!应该如何创建这个缓冲区。想象一下,我有键/值对,其中键是整数,值是不同长度的字符串?

【问题讨论】:

【参考方案1】:

马丁,

如果您没有看到,请联系 BDB OTN 论坛上的 Emily replied to this question。与 *** 相比,这是一个获取信息和更密切监控的好地方。您还可以在那里找到一个活跃的开发者社区。

问候,

戴夫

【讨论】:

戴夫,感谢您提供的信息。我没有看到艾米丽的解决方案。正如我所见,我大部分都做对了。只是旗帜是不必要的:) 但实际上她没有回答我的问题。我问的是 DbtMultipleKeyDataBuilder 而不是 DbtMultipleDataBuilder。但无论如何,应该有 C++ API 的官方示例/测试。马丁

以上是关于如何在 Berkeley DB 中使用批量功能?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Berkeley DB(bsddb 模块)、Python

如何在 Berkeley DB 5.2.28 中使用堆访问方法

如何用 Berkeley DB 替换 SQLite

如何在不安装的情况下在应用程序中使用 Berkeley DB

使用 Berkeley DB 事务处理的问题

如何为 MXE 交叉编译器编译 Berkeley DB 5.3.28?