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

时间:2011-01-27 09:46:34

标签: c++ bulkinsert berkeley-db bulk

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

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

我应该如何初始化DbMultipleKeyDataBuilder的构造函数参数? Db :: put方法的数据参数会发生什么?它应该是空的还是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 个答案:

答案 0 :(得分:0)

马丁,

如果您没有看到它,请参阅BDB OTN论坛上的Emily replied to this question。它是获取信息并比Stackoverflow更密切监控的好地方。你也会在那里找到一个活跃的开发者社区。

问候,

戴夫