Storage

圖數據庫如何在磁碟上儲存數據

  • December 10, 2020

我看過這些論文:

……還有其他一些人。我是數據庫新手(除了在不了解其內部結構的情況下將它們用於 Web 應用程序),因此我對如何使用磁碟進行儲存沒有太多基礎。

我想大致了解這些論文在文件系統上儲存圖形的作用。在簡要瀏覽它們時,他們提到將相關子圖從磁碟載入到記憶體中以進行有效的更新/查詢。其中一些將邊儲存在一組文件中(稱為“碎片”),將頂點儲存在另一組文件中(稱為“間隔”)。有些有多個不同的ID,例如TurboGraph中的“記錄ID(RID)”和“頂點ID” (下圖1)。

但是,我還沒有看到所有部分如何組合在一起的完整概述。想知道是否有人可以解釋這一點。

具體來說:

  1. 如何將資料結構化為圖形數據庫的文件(高級)。
  2. 在高級別將內容載入到記憶體中進行查詢/更新時必鬚髮生什麼。

到目前為止,我還不清楚需要將什麼載入到記憶體中,以及 ID 的具體用途。我不確定每個頁面(通常> = 1MB)是否被載入到記憶體中並以某種方式解析,或者逐行掃描,或者類似的東西(基本上不確定文件是如何解析/掃描的,如果它是解析成某種記憶體資料結構,或者如果你可以直接在文件字節上進行圖形遍歷)。而且我不確定這些 ID 的用途。在 RDBMS 中,ID 有時是每個表的遞增整數,沒有其他含義。在這些論文中,ID 似乎更多地與頁面中頂點的位置以及某種偏移等有關。此外,一些論文為一個帶有所有邊的頂點(一個鄰接列表)儲存了一條大的單行(看起來),但我想知道每個頂點是否有數千或數百萬條邊該怎麼辦。如果可以指出要尋找的相關特徵,那麼進行進一步的研究將有助於使這一點更加清晰。

非常感謝您的時間,我希望這是有道理的。


圖1。

在此處輸入圖像描述

我相信圖表的每個實現都會因它們如何從磁碟寫入和讀取而有所不同。

在 Manish Jain 的Dgraph: Synchronously Replicated, Transactional and Distrubuted Graph Database的第 2 頁第 2.2 節中,介紹了數據儲存討論:

Dgraph 數據儲存在稱為 Badger 的可嵌入鍵值數據庫中,用於磁碟上的數據輸入輸出。Badger 是一種基於 LSM-tree 的設計,但與其他設計不同的是,它可以選擇性地將值與鍵分開儲存,以生成更小的 LSM 樹,從而降低寫入和讀取放大。


您詢問:

  1. 如何將資料結構化為圖形數據庫的文件

數據按主謂組儲存到發布列表中。任何包含邊列表的節點都會將該列表儲存在單個發布列表中,直到它達到某個大小門檻值並且需要拆分為兩個或多個列表。這可以理解為,任何一對一的關係邊或謂詞都保存在自己的列表中,而一對多的關係邊或謂詞被分組在一起,並將連結的uid或對象值保存到一個列表中。主要的收穫是 Badger 將值與鍵分開儲存以生成更小的樹,從而提高讀寫性能。

  1. 在高級別將內容載入到記憶體中進行查詢/更新時必鬚髮生什麼。

Manish 剛剛發布了一篇關於記憶體管理的部落格文章,並且可以比我自己更好地解釋這方面的內容。

引用自:https://dba.stackexchange.com/questions/211017