當前位置:
首頁 > 知識 > Python3在磁碟上的B+樹:Bplustree

Python3在磁碟上的B+樹:Bplustree

Python3在磁碟上的B+樹:Bplustree

Python部落(python.freelycode.com)組織翻譯,禁止轉載,歡迎轉發。

Bplustree

Python3在磁碟上的B+樹。

它就像一個字典,但存儲在磁碟上。那麼什麼時候使用它呢?

  • 要存儲的數據不適合存在內存里時

  • 數據需要被持久化時

  • 鍵的順序很重要時

此項目正在開發中,不同版本的文件格式會有所不同;因此,該數據不要用作您主要的數據來源。

快速開始

用pip安裝Bplustree:

Python3在磁碟上的B+樹:Bplustree

創建存儲在文件中的B+樹索引,並按如下方式使用它:

Python3在磁碟上的B+樹:Bplustree

鍵和值

鍵必須具有自然順序,並且必須可序列化成位元組;其中提供了最常見類型的一些默認序列化程序,例如,索引UUID:

Python3在磁碟上的B+樹:Bplustree

另一方面,值總是位元組。它們可以是任意長度的,參數value_size=128定義了在樹本身中可以存儲的值的大小上限。超出此限制的值將存儲在溢出頁面中,每個溢出值至少佔滿一頁。

迭代

由於鍵有順序,所以按順序檢索元素是非常有效的:

Python3在磁碟上的B+樹:Bplustree

也可以通過給出Python片段遍歷樹的子集:

Python3在磁碟上的B+樹:Bplustree

兩種方法都使用一個生成器,所以它們不需要將整個內容載入到內存中,而是將樹的一部分複製到字典中也是可以的:

Python3在磁碟上的B+樹:Bplustree

並發性

樹是線程安全的,它支持多用戶讀取/單用戶寫入。

如下是安全的:

  • 在多個線程之間共享一個BPlusTree實例。

如下是不安全的:

  • 在多個進程之間的共享一個BPlusTree實例。

  • 創建指向同一文件的多個BPlusTree實例。

持久化

預寫日誌(WAL)用於確保數據安全。對樹所做的所有更改都附加到WAL中,通常在關閉樹時,僅在檢查點的操作中才會合併到樹中。這種方法來自於其他資料庫的啟發,例如SQLite。

如果樹沒有正確關閉(停電,進程停止...),WAL文件會在下一次樹被打開時合併。

性能

像任何資料庫一樣,有許多方法可以微調引擎並獲得最佳性能:

  • order或分支因子,定義每個節點將容納多少條目;

  • page_size是分配給一個節點的位元組數量和讀寫操作的長度,最好保持接近磁碟的塊大小;

  • cache_size保持頻繁使用的節點,大緩存防止了從原始頁面創建Python對象的昂貴操作,但是使用了更多的內存。

有效使用樹的一些建議:

  • 如果可能的話,按照升序插入元素,首選UUID v1到UUID v4;

  • 使用tree.batch_insert(iterator)批量插入,而不是循環使用tree.insert;

  • 迭代使用樹,而不是在循環中使用tree.get;

  • 如果插入很多使用tree.checkpoint,這將防止WAL無限增長;

  • 使用小鍵和值,相應地設置其限制和溢出值;

  • 將文件和WAL存儲在快速磁碟上;

許可證

MIT


英文原文:https://github.com/NicolasLM/bplustree
譯者:掌心化雪

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python部落 的精彩文章:

Python鏈式操作:PyFunctional

TAG:Python部落 |