如果你使用全域變數來解決那些他們真正擅長的問題,你可以得到出色的結果。無論是在生產力方面還是在簡化問題的解決方案方面(
全域變數是一種儲存和處理資料的特殊方式,與 SQL 中的資料表完全不同。他們於 1966 年以語言出現
現代 DBMS 中的全域變數支援事務、日誌記錄、複製和分區。那些。它們可用於建構現代、可靠、分散式和快速的系統。
全域變數不會將您限制於關係模型。它們使您可以自由地開發針對特定任務最佳化的資料結構。對於許多應用程式來說,聰明地使用全域變數確實可以成為一種秘密武器,提供關係應用程式開發人員夢寐以求的效能。
全域變數作為一種儲存資料的方式可以在許多現代程式語言中使用,無論是高階還是低階。因此,在本文中,我將特別關注全域變量,而不是它們曾經來源的語言。
2. 全域變數如何運作
讓我們先了解全局人員如何運作以及他們的優勢是什麼。可以從不同的角度來看全局變數。在本文的這一部分中,我們將把它們視為樹。或像分層資料倉儲。
簡單來說,全域就是一個持久數組。自動儲存到磁碟的陣列。
很難想像還有比這更簡單的資料儲存方法。在程式碼中(COS/M 語言),它與常規關聯數組的差異僅在於符號 ^ 在名字之前。
要在全域中保存數據,您不需要學習 SQL 查詢語言;使用它們的命令非常簡單。他們可以在一小時內學會。
讓我們從最簡單的例子開始。有 2 個分支的單層樹。範例是用 COS 編寫的。
Set ^a("+7926X") = "John Sidorov"
Set ^a("+7916Y") = "Sergey Smith"
當資訊插入全域(Set 指令)時,會自動發生 3 件事:
- 將資料保存到磁碟。
- 索引。 括號裡的是鍵(在英文文獻中是“下標”),等號右邊是值(“節點值”)。
- 排序。 數據按鍵排序。將來,在遍歷數組時,第一個元素將是“Sergey Smith”,第二個元素將是“John Sidorov”。當從全域接收到使用者清單時,資料庫不會浪費時間進行排序。此外,您可以請求輸出排序列表,從任何鍵開始,甚至是不存在的鍵(輸出將從第一個真正的鍵開始,該鍵位於不存在的鍵之後)。
所有這些操作都發生得非常快。在我的家用電腦上,我在單一進程中獲得高達 750 次插入/秒的值。在多核心處理器上該值可以達到
當然,插入速度本身並不能說明什麼。例如,您可以非常快速地將資訊寫入文字檔案 - 像這樣
- 全域變數的最大優勢是插入新節點的速度。
- 全域資料始終被索引。無論是在一層還是深入樹中,遍歷它們總是很快的。
讓我們為全域添加更多第二層和第三層的分支。
Set ^a("+7926X", "city") = "Moscow"
Set ^a("+7926X", "city", "street") = "Req Square"
Set ^a("+7926X", "age") = 25
Set ^a("+7916Y", "city") = "London"
Set ^a("+7916Y", "city", "street") = "Baker Street"
Set ^a("+7916Y", "age") = 36
顯然,可以基於全域變數來建立多級樹。此外,由於插入期間的自動索引,對任何節點的存取幾乎是瞬時的。在樹的任何級別,所有分支都按鍵排序。
如您所見,資訊可以儲存在鍵和值中。總密鑰長度(所有索引長度總和)可以達到
另一個有趣的點。您可以在不指定上層節點值的情況下建立樹。
Set ^b("a", "b", "c", "d") = 1
Set ^b("a", "b", "c", "e") = 2
Set ^b("a", "b", "f", "g") = 3
空心圓圈是沒有分配值的節點。
為了更好地理解全域變量,讓我們將它們與其他樹進行比較:花園樹和檔案系統名稱樹。
讓我們將全局樹與我們最熟悉的層次結構進行比較:與生長在花園和田野中的普通樹以及文件系統。
正如我們在園林樹木中看到的那樣,葉子和果實只出現在樹枝的末端。
檔案系統 - 資訊僅儲存在分支的末尾,這是完全限定的檔案名稱。
這是全域資料結構。
不同之處:
- 內部節點: 全域中的資訊可以儲存在每個節點中,而不僅僅是儲存在分支的末端。
- 外部節點: 全域必須在分支的末端有定義的值,而 FS 和花園樹則沒有。
就內部節點而言,我們可以說全域的結構是檔案系統中的名稱樹和花園樹結構的超集。那些。更靈活。
整體來說,全球是 有序樹能夠在每個節點中儲存數據.
為了更好地理解全域變數的工作,想像一下如果檔案系統的創建者使用類似於全域變數的方法來儲存資訊會發生什麼?
- 刪除目錄中的單一檔案將自動刪除該目錄以及僅包含剛剛刪除的一個目錄的所有覆蓋目錄。
- 不需要目錄。只會有帶有子文件的文件和沒有子文件的文件。如果比喻成一棵普通的樹,那麼每根樹枝都會結出果實。
- 可能不需要 README.txt 檔案之類的東西。關於目錄內容需要說明的所有內容都可以寫入目錄檔案本身。在路徑空間中,檔案名稱與目錄名稱無法區分,因此可以只使用檔案。
- 刪除帶有嵌套子目錄和檔案的目錄的速度將大大提高。 Habré 上曾多次出現關於刪除數百萬個小檔案需要多長時間和多困難的文章(
1 ,2 )。但是,如果您在全域上建立偽檔案系統,則需要幾秒鐘或幾秒鐘的時間。當我在家用電腦上測試刪除子樹時,它在 1 秒內從 HDD(而非 SSD)上的兩層樹中刪除了 96-341 億個節點。此外,我們正在討論刪除樹的一部分,而不僅僅是帶有全域變數的整個檔案。
刪除子樹是全域變數的另一個強項。為此,您不需要遞歸。 這發生得非常快。
在我們的樹中,這可以透過命令來完成 殺.
Kill ^a("+7926X")
為了更好地了解我們可以透過全域變數採取哪些操作,我將提供一個簡短的表格。
在 COS 中使用全域變數的基本命令和函數
設定分支到節點(如果尚未定義)和節點值
複製子樹
刪除子樹
刪除特定節點的值。從該節點出現的子樹未被觸及
完全遍歷樹,深入樹
遍歷特定節點的分支
檢查節點是否已定義
原子地遞增節點值。為了避免進行讀取和寫入,以確保 ACID。最近建議改為
感謝您的關注,我們已準備好回答您的問題。
免責聲明: 本文以及我對其的評論僅代表我的觀點,與 InterSystems Corporation 的官方立場無關。
延期
來源: www.habr.com