CSR格式如何更新? GES圖計算引擎HyG揭秘之數據更新

来源:https://www.cnblogs.com/huaweiyun/archive/2023/06/20/17493659.html
-Advertisement-
Play Games

摘要:HyG圖計算引擎採用CSR格式來存儲圖的拓撲信息,CSR格式可以將稀疏矩陣的存儲空間壓縮,進而大大降低圖的存儲開銷,同時具備訪問效率高、格式易轉化等優點。 本文分享自華為雲社區《CSR格式如何更新? GES圖計算引擎HyG揭秘之數據更新》,作者: π 。 HyG圖計算引擎採用CSR格式來存儲圖 ...


摘要:HyG圖計算引擎採用CSR格式來存儲圖的拓撲信息,CSR格式可以將稀疏矩陣的存儲空間壓縮,進而大大降低圖的存儲開銷,同時具備訪問效率高、格式易轉化等優點。

本文分享自華為雲社區《CSR格式如何更新? GES圖計算引擎HyG揭秘之數據更新》,作者: π 。

HyG圖計算引擎採用CSR格式來存儲圖的拓撲信息,CSR格式可以將稀疏矩陣的存儲空間壓縮,進而大大降低圖的存儲開銷,同時具備訪問效率高、格式易轉化等優點。利用CSR + 列存(parquet格式)的組合,HyG獲得了很高的圖訪問性能。但是,對於數據需要增量更新的場景,CSR的更新非常困難,可能會導致大量的數據複製和移動,進而影響系統性能。HyG對傳統CSR更新進行了一系列優化,實現了高效的數據更新。

什麼是CSR格式?

CSR格式是一種常用的稀疏矩陣存儲格式,它將稀疏矩陣以三個數組的形式存儲。具體來說,CSR格式使用 values、column indices和row offsets三個數組來表示稀疏矩陣。


定義NNZ(Num-non-zero)為矩陣M中非0元素的個數。

第一個數組為values數組。其中,values數組的長度為NNZ,分別從左到右從上到下的非零元素的值。

第二個數組為column數組。其中,column數組的長度為NNZ,其對應於values數組中的元素的column_index(例如元素8排列在所在行的第3個位置,因此其column index為2)。

第三個數組為row offsets,其中row offsets的數組大小為m+1,其前m個元素分別代表這每一行中第一個非零元素在Values數組的下標。(例如元素2是第二行的第二個元素,其在values數組中的下標為2.)。

CSC和CSR類似,只不過和CSR行列互換。values數組裡是按列存的數值,row offsets變成了col offsets,column數組變成了row數組。

CSR格式由於其緊湊的存儲方式和高效的計算方式,已經成為了處理稀疏矩陣的標準格式之一。具體來說,CSR格式可以利用連續的記憶體塊來存儲非零元素,這使得電腦在處理稀疏矩陣時可以跳過大量的零元素,從而提高了計算效率。此外,CSR格式所需要的存儲空間相對於其他格式,如COO格式(Coordinate)等,也更為緊湊,這在處理大型稀疏矩陣時非常有利。

如何更新CSR格式數據?

傳統方案:

更新圖數據需要對三個數組進行操作:values、columns和row offset。

更新

要更新矩陣中某個位置(i,j)的值,需要找到該位置在CSR格式中對應的行(第i行)在values和columns數組中的起始和結束索引。具體而言,該行的非零元素在values數組中的起始位置是row offset [i],結束位置是row offset [i+1]-1。然後,在columns數組中找到對應的列(第j列)的索引位置。

接下來,可以直接更新values數組中對應位置的值,即values[row offset[i]+k],其中k是columns數組中第j列的索引位置。

插入

如果要插入一個新的非零元素,可以按照以下步驟進行:

1、找到要插入的元素在CSR格式中對應的行(第i行)在values和columns數組中的起始和結束索引,方法同上。

2、在columns數組中找到新元素應該插入的位置,即找到插入元素後columns數組中第j列的索引位置。

3、將新元素的值插入到values數組中正確的位置,並將columns數組中對應位置以及後面的元素向後移動一個位置。

4、更新row offset數組中第i行及其後面所有行的元素起始位置,因為在第i行插入了一個新的非零元素。

刪除

如果要刪除一個非零元素,可以按照以下步驟進行:

1、找到要刪除的元素在CSR格式中對應的行(第i行)在values和columns數組中的起始和結束索引,方法同上。

2、在columns數組中找到要刪除的元素的位置。

3、從values和columns數組中刪除該元素,並將後面的元素向前移動一個位置。

4、更新row offset數組中第i行及其後面所有行的元素起始位置,因為在第i行刪除了一個非零元素。

需要註意的是,更新CSR格式中的元素可能會導致數組長度的變化,因此需要動態分配和釋放記憶體空間。此外,在進行插入和刪除操作時,可能需要對row offset數組中的元素進行更新,這可能會影響CSR格式的性能。

總之,CSR格式的更新操作相對複雜,需要對三個數組進行操作,並需要考慮記憶體分配和數組長度的變化等問題,這十分不利於實時分批式的增量更新。

HyG數據更新策略

  • 每次更新都會生成一個子圖(delta_graph),這個子圖是CSR格式,描述了增量信息。
  • 引入deleted_biset數組,記錄被刪除的點、邊信息。
  • 按順序載入 MergedPG = pg + [delta_graph]
  • 對各點、邊按照所屬的pg/ delta_graph進行本地訪問和增、刪。

因為HyG考慮了分散式切分圖的場景,我們將場景簡化,接下來描述一下數據更新的流程。

圖原始數據如下圖所示,圖中包含4個點,4條邊,4條邊上的值分別為1、7、2、8。

圖對應的CSR格式如下圖所示,這個是原始的拓撲數據。

我們對數據進行更新,基於原始圖新增了邊0(src)->3(dst),邊的值為3。刪除了邊1(src)->2(dst),邊的值為8。


新增了1條邊,邊的src是0,dst是3,因此CSR的row offset為[1 1 1 1],column為[3],value為[3]。進而得到了右側的delta graph。

刪除了1條邊,這條邊是屬於pg(原始圖),所以,我們會對pg的deleted_bitset置位,因為刪除是column數組的最後一個,因此,我們會將最後一個bit置為1,表示這個邊已被刪除。

到此,我們就完成了一次增、刪操作,生成了一個新的delta graph,這個delta graph跟歷史數據沒有任何關係,它只表示了本次增量的數據,因此,對於超大規模的圖,更新數據不再需要大量的數據拷貝和移動,只需要生成一個很小的delta graph就可以了。

圖訪問

經過增量更新,全量圖的信息就會被分解為一個原始圖和一個增量圖。HyG設計了一種同時讀取到兩個圖信息的訪問迭代器(以下簡稱“二級迭代器”),這種迭代器會將這多個子圖視為一個全量圖訪問,可以在不同的子圖間游走。

HyG增量圖迭代性能優化

HyG增量圖會產生多個快照,每個快照是一個子圖,對應著一次commit。演算法讀取增量圖需要依賴HyG的二級迭代器,迭代器會在不同的快照間游走,校驗點、邊是否已被刪除,最終返回給演算法結果。因此,迭代器需要維護很多信息,遠遠大於pg(原始圖)的輕量級迭代器,進而使增量圖迭代的性能很低,快照數量越多性能下降越劇烈。

優化方案

HyG引入基於頁的快照索引技術來緩解由於存在大量快照導致的性能下降問題。

為每個快照劃分虛擬頁,比如頁的大小是4K,那麼一個頁對應著4K個點以及這4k點對應的邊。

索引表記錄了每個頁最近被更新的快照,因此,如果這個頁沒有被更新,那麼利用索引表可以直接跳過對應的快照。

索引表採用copy on write的方式更新,每生成一個新快照,會把上一個快照的全部索引信息copy一份,然後把修改信息更新到對應的索引上,得到最新快照的索引表。

同時,對於二級迭代器的構造,我們也進行了優化,儘量減少數據成員的數量,當迭代器在不同快照間切換時,去更新該快照的上下文信息,而不會維護所有快照的信息。

利用快照索引技術,我們可以快速的定位到點、邊對應的最新修改的快照,進而可以跳過很多無效的訪問。但是,隨著快照數量的增多,圖遍歷的性能還是會不斷下降,被刪除的點、邊不但浪費了大量的存儲空間,還會增加無效的訪問延時,因此,設計一套有效的自動化合併方案,當快照數量過多或者刪除點、邊過多時,觸發合併,提升系統性能。如果大家感興趣,我們後面會接著介紹HyG是如何實現快照合併的。

 

點擊關註,第一時間瞭解華為雲新鮮技術~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ## 一:背景 ### 1. 講故事 前些天有位朋友找到我,說他的程式跑著跑著就崩潰了,讓我看下怎麼回事,其實沒怎麼回事,抓它的 crash dump 就好,具體怎麼抓也是被問到的一個高頻問題,這裡再補一下鏈接: [.NET程式崩潰了怎麼抓 Dump ? 我總結了三種方案] https://www. ...
  • `WPF`的依賴屬性是一項強大的功能,它允許我們創建可擴展、靈活和可重用的`UI`組件。通過依賴屬性,我們可以實現屬性的數據綁定、樣式化、動畫化以及屬性值的有效驗證和轉換。在本文中,我們介紹了幾個關鍵概念和用法,包括初始依賴屬性、自定義依賴屬性、只讀依賴屬性以及附加屬性。 ...
  • >原本只是想要每次打開終端,預設是 zsh ,方便使用 oh-my-zsh。但誰能料到這個配置有個史前大坑! ## 問題復現 頂部菜單欄的`終端` > 首選項配置:`未命名` > `命令` > 運行自定義命令 > 命令退出時:退出終端。 **只要這條命令出錯,或者執行完畢,就會結束退出了** (太痛 ...
  • ## 使用(微軟賬戶)進行遠程桌面連接 1. 打開找到[查看高級系統設置] -> [遠程] -> [遠程桌面]。 ![image](https://img2023.cnblogs.com/blog/3081210/202306/3081210-20230620213008346-1294112930 ...
  • logstash在需要收集日誌的伺服器里運行,將日誌數據發送給es 在kibana頁面查看es的數據 es和kibana安裝: Install Elasticsearch with RPM | Elasticsearch Guide [8.8] | Elastic Configuring Elast ...
  • ##[Ooonly新人貼]記錄工作中遇到的問題,話不多說先上乾貨 問題:類似K線與藍牙接收部門模塊,要求由原來的接收串口中斷改為DMA接收。據說要用到空閑中斷與DMA中斷,但是經模擬發現DMA每完成傳輸一個數據(比如1BYTE)就會進入空閑中斷(k線發現這種情況),考慮到這樣進入中斷的頻率和以前串口 ...
  • 更改緩衝區(Change Buffer)是一種特殊的數據結構,用於緩存不在緩衝池中的二級索引(secondary index)頁的更改。可能來自於 INSERT、UPDATE 或 DELETE 操作(數據操作語言,DML)的緩衝更改,會在後續通過其他讀操作將這些頁載入到緩衝池時被合併。 ...
  • 摘要:華為宣佈實現了自主創新的MetaERP研發,並且完成了對舊ERP系統的全面替換,這其中,就採用了華為雲GaussDB資料庫特有的全密態技術,對ERP系統中的絕密數據進行加密保護,從而保障了數據的安全。 ERP系統在幫助企業優化業務流程、實現數字化管理方面有重要作用,可以說企業所有的業務流轉都需 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...