Python3在磁碟上的B+樹:Bplustree
Python部落(python.freelycode.com)組織翻譯,禁止轉載,歡迎轉發。
Bplustree
Python3在磁碟上的B+樹。
它就像一個字典,但存儲在磁碟上。那麼什麼時候使用它呢?
要存儲的數據不適合存在內存里時
數據需要被持久化時
鍵的順序很重要時
此項目正在開發中,不同版本的文件格式會有所不同;因此,該數據不要用作您主要的數據來源。
快速開始
用pip安裝Bplustree:
創建存儲在文件中的B+樹索引,並按如下方式使用它:
鍵和值
鍵必須具有自然順序,並且必須可序列化成位元組;其中提供了最常見類型的一些默認序列化程序,例如,索引UUID:
另一方面,值總是位元組。它們可以是任意長度的,參數value_size=128定義了在樹本身中可以存儲的值的大小上限。超出此限制的值將存儲在溢出頁面中,每個溢出值至少佔滿一頁。
迭代
由於鍵有順序,所以按順序檢索元素是非常有效的:
也可以通過給出Python片段遍歷樹的子集:
兩種方法都使用一個生成器,所以它們不需要將整個內容載入到內存中,而是將樹的一部分複製到字典中也是可以的:
並發性
樹是線程安全的,它支持多用戶讀取/單用戶寫入。
如下是安全的:
在多個線程之間共享一個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
譯者:掌心化雪
TAG:Python部落 |