2011-03-07 91 views
0

嗨 我找不到任何關於Berkeley DB批量插入功能寫在C。我可以找到關於更新,選擇和刪除在http://download.oracle.com/docs/cd/E17076_02/html/programmer_reference/am_misc_bulk.html。任何人都可以告訴我如何編寫這個批量插入功能嗎?我是C和Berkeley DB的新手。Berkeley DB批量特徵

  • 我也想用這個功能寫很多數據(可能是30GB),所以也請告訴我性能。
  • 我的老闆希望我使用Hash訪問方法。

感謝

凱文

+2

可憐的你,是C新來的,任務是應付Berkeley DB API。 – 2011-03-07 09:32:04

+0

是的!在我來實習之前從未聽說過伯克利DB。 – kevin 2011-03-08 01:52:04

回答

3

我不知道這是否會幫助或傷害給予你新奇於C和BerkleyDB 。

你可能會需要使用DB_MULTIPLE國旗DB->put()

爲了做到這一點,你需要爲你的鑰匙創建批量DBT結構,以及一個爲您的數據。緩衝區必須足夠大以相應地保存整組鍵和值。然後您必須用DB_MULTIPLE_WRITE_INIT初始化它們,然後將您的密鑰和值與DB_MULTIPLE_WRITE_NEXT一起添加到相應的緩衝區。

這在4.8添加和誠實,我無法通過谷歌找到你一個具體的例子。

編輯:至少在最新版本中提供了BerkeleyDB批量操作的示例代碼。您需要看看examples/c/ex_bulk.c

+0

非常感謝!我會試試看:D – kevin 2011-03-08 01:56:36

+0

還有一個問題,我需要一個DBT的密鑰和數據。對 ???緩衝區必須足夠大,才能使用鍵和值。那麼這是否意味着我必須把我所有的散裝放在鑰匙中?你能否詳細說明一下,因爲我很困惑。我看着ex_bulk,但仍然不明白。對我的無知感到抱歉。 – kevin 2011-03-08 02:22:33

+0

您必須將所有密鑰加載到一個DBT中,並將所有值加載到另一個DBT中(當然,按照匹配順序)。當你有一個像你這樣描述的大數據集時,通常的做法是每次處理一個塊(比如說1G左右),這樣你就不會一次性處理所有的數據。如果沒有對C語言的堅實掌握以及BerkeleyDB的一些經驗,你所要做的並不是微不足道的。 – 2011-03-08 02:30:40

1

你可以嘗試做一個或更多的提交/交易。例如:啓動一個事務,做插入,結束事務。這是加快數據庫更改的正常方法,因爲它減少了獨立SQL語句的事務開銷。

我不熟悉伯克利DB API,所以它可能有一些更適合批量操作,只是提供建議。

編輯:
一些鏈接關於交易:
1. Wikipedia entry
2. Berkley DB Transaction Throughput

+0

嗨如果我們使用交易,我們的表現會更好?獨立SQL語句的開銷是多少?你能向我解釋一下嗎?或者給我一些鏈接,這樣我就可以上網了。對不起我的無知。 – kevin 2011-03-08 02:12:46

+0

非常感謝! – kevin 2011-03-09 01:28:56

1

Berkeley DB forums由幾個伯克利DB開發人員監視。這將是發佈這些問題的另一個好地方。

+0

感謝您的諮詢! – kevin 2011-03-09 01:29:22

+0

我有同樣的問題,但對於C++。我在這裏詢問了BDB論壇:http://forums.oracle.com/forums/thread.jspa?messageID=9315489�。 – 2011-03-23 09:14:31

1

對於C++用戶着想,繼承人如何使用伯克利C++ API,這既是無證,和具有零​​倍的例子來做到這一點。它雖然工作得很好!

創建DBT(數據庫升,Im不使該向上)以保持存儲器緩衝器的保持:

無效* BUF =新無符號字符[BUFFERSIZE]; dbt = new Dbt; dbt-> set_data(buf); dbt-> set_ulen(bufferSize); dbt-> set_flags(DB_DBT_USERMEM);

準與一個DBMultipleKeyDataBuilder:

DBMultipleKeyDataBuilder * DBI =新DBMultipleKeyDataBuilder(DBT);

您的附加鍵和值對一次一個,直到完成或緩衝區滿

DBI->追加(curKeyBuf,curKeyLen,curDataBuf,curDataLen); ...(其它更多的這些)...

使用您的DB *分貝,如果你在TXN希望交易和批量寫: DB->放(TXN,DBT,NULL,DB_MULTIPLE_KEY) ;

delete dbi;

我錯過了很多細節,例如檢查緩衝區已滿或足夠大以容納一個KV對。

DBMultipleKeyDataBuilder只能使用一次,但一個真正有效的實現將保留一個緩衝區Dbt對象池並重用它們。您也可以使用這些Dbts進行批量讀取,因此可以使用它們的公共池。

1

在Berkeley DB中批量加載散列表一直是個問題。以下文章進一步探討了這一點,並提出了一種加速算法。建議的算法以線性散列(Berkeley DB)的方式對數據進行排序,因此可以在排序數據的一次掃描中完成加載。這對於大型數據集來說非常好。 Davood Rafiei,Cheng Hu,Bulk加載線性散列文件,Proc。 DaWak會議,2006年。 https://webdocs.cs.ualberta.ca/~drafiei/papers/dawak06.pdf