2010-09-29 112 views
6

我剛開始前幾天與Berkeley DB的打,所以我想看看是否有什麼東西我已經錯過了,當涉及到數據存儲儘可能快地把優化性能。在Berkeley DB的

以下是關於數據的一些信息: - 它有512字節塊 - 塊來爲了 - 塊將在FIFO順序 被刪除 - 如果我失去了一些數據了,因爲停電結束沒關係只要整個數據庫不破

讀取一串這似乎是一個隊列分貝正是我想要的文檔後。

但是,試圖測試一些代碼後,我最快的結果是大約只有每秒1Mb的循環,通過DB->把與DB_APPEND集。我也嘗試過使用交易和大宗交易,但這兩種交易都大幅放緩,所以我沒有花費很多時間追蹤它們。我在我的Freescale i.MX35開發板上插入一個創建在NANDFlash芯片上的新數據庫。

由於我們希望獲得至少每秒2MB的寫入速度,因此我想知道是否有錯誤可以提高我的速度,因爲我知道我的硬件寫入速度比這更快。

回答

8

嘗試把這個到你的DB_CONFIG:

set_flags DB_TXN_WRITE_NOSYNC 
set_flags DB_TXN_NOSYNC 

從我的經驗,這些提高寫入性能很多。


DB_TXN_NOSYNC 如果設置,Berkeley DB的不會寫或同步刷新在事務提交或準備日誌。這意味着交易顯示ACI(原子性,一致性和隔離)屬性,但不顯示D(耐久性);也就是說,數據庫的完整性將保持不變,但如果應用程序或系統出現故障,則可能是最近提交的事務的一些數量可能恢復過程中被撤銷。處於危險中的事務數由多少次日誌更新可適用於日誌緩衝區,操作系統刷新髒緩衝區到磁盤的頻率以及日誌檢查點的頻率決定。 使用DB_TXN_NOSYNC標誌調用DB_EN​​V-> set_flags僅影響指定的DB_EN​​V句柄(以及在該句柄範圍內打開的任何其他Berkeley DB句柄)。對於整個環境中的一致行爲,所有DB_EN​​V負責處理環境必須要麼設置DB_TXN_NOSYNC標誌打開或標誌應在DB_CONFIG配置文件中指定。

DB_TXN_NOSYNC標誌可用於在應用程序生命週期中的任何時間配置Berkeley DB。


DB_TXN_WRITE_NOSYNC 如果設置,Berkeley DB的會寫,但不會同步刷新,在事務日誌提交或準備。這意味着交易顯示ACI(原子性,一致性和隔離)屬性,但不顯示D(耐久性);也就是說,數據庫完整性將得到維護,但如果系統發生故障,則可能會在恢復過程中取消一些最近提交的事務。處於危險中的事務數由系統刷新髒緩衝區到磁盤的頻率以及日誌檢查點的頻率決定。 調用DB_EN​​V-> set_flags與DB_TXN_WRITE_NOSYNC標誌隻影響特定DB_EN​​V手柄(以及任何其他的Berkeley DB句柄手柄的範圍內打開)。對於整個環境中的一致行爲,在環境中打開的所有DB_EN​​V句柄必須設置DB_TXN_WRITE_NOSYNC標誌,或者應該在DB_CONFIG配置文件中指定該標誌。

DB_TXN_WRITE_NOSYNC標誌可用於在應用程序生命週期的任何時間配置Berkeley DB。

查看http://www.mathematik.uni-ulm.de/help/BerkeleyDB/api_c/env_set_flags.html瞭解更多詳情。

+0

感謝您的評論。但是,我發現僅僅啓用環境會產生太多的性能下降,而不會使用環境。我認爲這與WAL有關,所以這些標誌可以幫助我,但即使沒有環境,一切都太慢了。 – jjfine 2010-09-30 14:46:26

+0

@jjfine:如果你沒有明確地這樣做,我相信環境隱式地用於匿名(自動提交)事務。所以不使用環境不會有幫助。 – 2010-09-30 15:53:01

+0

@ VladLazarenko,所以如果我設置這兩個標誌中的一個,當關閉berkeley db時,緩存是否會刷新到磁盤? – Alcott 2013-02-01 09:20:28

1

我建議你必須使用transactions/TDS數據存儲,如果你提到你不能重新創建一個數據庫(即它不只是一個本地緩存),如果它被損壞。如果您不在意在發生崩潰/停電時丟失了一些項目,那麼DB_TXN_WRITE_NOSYNC將提高TDS性能,您的數據庫仍然是不可或缺的並且可以恢復。 如果您使用BTREE和數字索引(如果您沒有自然鍵)進行存儲並且注意endian問題,以便您獲得良好的關鍵位置和較高的頁面利用率,那麼您應該可以獲得超過2000次插入,特別是到SSD,特別是如果您使用DbMultileKeyDataBuilder進行批量插入。