2010-10-11 63 views
18

我聽說B-Tree數據庫比哈希錶快,所以我想爲我的項目使用B-Tree數據庫。 python中是否有任何現有的框架允許我們使用這種數據結構,還是必須從頭開始編寫代碼?Python中是否有B-Tree數據庫或框架?

+8

這是避免過早優化應用程序的好時機。只需獲得一份正在運行的應用程序,然後在需要的情況下尋找機會提高性能。順便說一下,你總是可以嘗試將'python b-tree'放入Google中以回答你的問題。 – 2010-10-11 20:21:37

+1

嗯,我確實有我的應用程序的原型,但問題是我必須處理的數據集字面上接近百萬,傳統哈希不能讓我如此高的速度..所以想到B樹的冒險。 – Rahul 2010-10-11 20:48:26

+0

怎麼了所有downvotes? (我贊成只是爲了反擊。)如果你認爲這個問題和答案沒有達到標準,請評論。 – 2010-10-11 21:06:02

回答

22

在內存或塊存儲(如在數據庫中)在散列表上選擇B樹的唯一原因是支持非平等的查詢。 B樹允許您執行性能良好的範圍查詢。然而,許多鍵值存儲(比如berkley db)並沒有使它在外部可見,因爲它們仍然會散列鍵,但是這仍然可以讓您快速而穩定地遍歷整個數據集(即使有添加,迭代器仍然有效或刪除,或樹必須重新平衡)。

如果你不需要範圍查詢,並且你不需要併發迭代,那麼你不需要b-樹,使用一個哈希表,它將在任何規模上更快。

編輯:我曾經有過上述事情真的是真的;爲此,blist包似乎是排序後的容器庫的最完整實現。

+0

Berkeley DB肯定可以讓你用光標做範圍查詢。請參閱http://docs.oracle.com/cd/E17076_02/html/gsg/CXX/Positioning.html – Gurgeh 2012-03-22 09:44:59

+1

關於「在散列表上選擇B樹的唯一原因,無論是在內存中還是在塊存儲...支持除了相等之外的查詢「是不正確的。除了範圍屬性,B樹還提供有效的有序遍歷。這可能非常重要。 – Christopher 2013-05-17 23:07:45

+0

「有序遍歷」是一個與範圍查詢密切相關的概念,所以我在我的答案中將它們放在一起。 – SingleNegationElimination 2013-05-18 00:23:02

3

編程您首先要做的事,然後根據需要進行優化。期。

編輯:

http://pypi.python.org/pypi/blist

隨時可替換內置列表python的。

+0

從技術上講,這是我程序的一部分,我不想要使用傳統的數據庫像MySQL ..並且我被告知要記住,數據插入將會在大集合中 – Rahul 2010-10-11 20:44:52

+0

因此,哈希表提供的不斷查找/訪問時間不足以滿足您正在進行的操作,而且您正在尋找朝着b-樹加速東西?我建議在閱讀有關它們的問題之前閱讀有關B樹和哈希值的知識。 – user318904 2010-10-11 20:56:01

+0

嗯,我做了一些基本的文學調查,並遇到這個http://www.igvita.com/2009/02/13/tokyo-cabinet-beyond-key-value-store/ 所提到的統計數據讓我更加喜歡B --Trees,不幸的是沒有一個python程序實現。 – Rahul 2010-10-11 21:24:46

2

SQLite3內部使用B +樹,但它聽起來像你可能想要一個鍵值存儲。試試Berkeley DB吧。如果您不需要交易,請嘗試HDF5。如果你想要一個分佈式鍵值存儲,也有http://scalien.com/keyspace/,但這是一個服務器 - 客戶端類型系統,它可以打開各種NoSQL鍵值存儲。

所有這些系統都將O(log(n))用於插入和檢索,因此它們可能會比您當前使用的哈希表更慢。

京都內閣提供了一個散列樹,所以可能更多的是你在看什麼,因爲它應該是O(1)插入和檢索,但是你不能按順序遍歷,如果你需要的話(儘管你目前使用散列樹,但這不應該成爲問題)。

http://fallabs.com/kyotocabinet/

如果你正在尋找的性能,你需要在編譯語言來實現速度的關鍵項目,然後在Python中的封裝API。

2

您可能想看看mxBeeBase,它是eGenix mx Base Distribution的一部分。它包括一個快速的磁盤B +樹實現,並提供允許在Python中構建磁盤字典或數據庫的存儲類。

1

Here有一個很好的btree純python實現。如果需要,您可以調整它。