如何在 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 中使用堆访问方法