Berkeley DB批量功能

时间:2011-03-07 09:24:43

标签: c database performance berkeley-db

您好 关于用 C 编写的Berkeley DB Bulk插入功能,我找不到任何地方。我可以在 http://download.oracle.com/docs/cd/E17076_02/html/programmer_reference/am_misc_bulk.html 找到有关更新,选择和删除的信息。谁能告诉我如何编写这个批量插入功能?我是 C和Berkeley DB的新手。

  • 我也想用这个功能写很多数据(可能是30GB),所以也请告诉我性能。
  • 我的老板要我使用哈希访问方法。

由于

凯文

5 个答案:

答案 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