您好 关于用 C 编写的Berkeley DB Bulk插入功能,我找不到任何地方。我可以在 http://download.oracle.com/docs/cd/E17076_02/html/programmer_reference/am_misc_bulk.html 找到有关更新,选择和删除的信息。谁能告诉我如何编写这个批量插入功能?我是 C和Berkeley DB的新手。
由于
凯文
答案 0 :(得分:3)
鉴于您对C和BerkleyDB的新见感,我不知道这是否会有所帮助或伤害。
您需要将DB_MULTIPLE
标记与DB->put()
一起使用。
要执行此操作,您需要为密钥创建批量DBT
结构,并为数据创建一个结构。缓冲区必须足够大,以便相应地保存整组键和值。然后,您必须使用DB_MULTIPLE_WRITE_INIT
初始化它们,然后使用DB_MULTIPLE_WRITE_NEXT
将密钥和值添加到相应的缓冲区。
这是在4.8中添加的,老实说,我无法通过谷歌找到一个具体的例子。
编辑:至少在最新版本中,BerkeleyDB提供了用于批量操作的示例代码。您需要查看examples/c/ex_bulk.c
答案 1 :(得分:1)
您可以尝试执行一个或多个提交/事务。例如:启动事务,执行插入,结束事务。这是加速数据库更改的常用方法,因为它减少了独立SQL语句的事务开销。
我不熟悉Berkely DB API,所以它可能更适合批量操作,只提供建议。
修改强>
关于交易的一些链接:
1. Wikipedia entry
2. Berkley DB Transaction Throughput
答案 2 :(得分:1)
Berkeley DB forums由几位Berkeley DB开发人员监控。这将是发布此类问题的另一个好地方。
答案 3 :(得分:1)
为了C ++用户,下面是如何使用Berkeley C ++ api来完成它,它既没有文档也没有示例。虽然它确实很好用!
创建一个Dbt(数据库Thang,我没有这样做)以保持内存缓冲区:
void * buf = new unsigned char [bufferSize]; dbt = new Dbt; dbt-> set_data(BUF); dbt-> set_ulen(BUFFERSIZE); dbt-> set_flags(DB_DBT_USERMEM);
将其与DBMultipleKeyDataBuilder相关联:
DBMultipleKeyDataBuilder * dbi = new DBMultipleKeyDataBuilder(dbt);
一次附加一个Key和Value对,直到完成或缓冲已满
DBI->附加(curKeyBuf,curKeyLen,curDataBuf,curDataLen); ......(更多这些)......
如果您希望在txn中使用您的DB * db和事务,并批量写入: db-> put(txn,dbt,NULL,DB_MULTIPLE_KEY);
删除dbi;
我错过了很多细节,例如检查缓冲区已满,或者大到足以容纳一对KV对。
DBMultipleKeyDataBuilder只能使用一次,但是一个非常有效的实现将保留一个缓冲区Dbt对象池并重用它们。您也可以使用这些Dbts进行批量读取,因此可以使用它们的公共池。
答案 4 :(得分:1)
在Berkeley DB中批量加载哈希过去一直是个问题。以下论文进一步探讨了这一点,并提出了一种加快速度的算法。建议的算法以线性散列(在Berkeley DB中)期望的方式对数据进行排序,因此可以在排序数据的一次扫描中完成加载。这适用于大型数据集。 Davood Rafiei,Cheng Hu,Bulk Loading a Linear Hash File,Proc。 2006年DaWak会议。 https://webdocs.cs.ualberta.ca/~drafiei/papers/dawak06.pdf