亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

NodeJs超長字符串問題處理的詳細分析

瀏覽:92日期:2022-06-01 11:40:24
目錄
  • 問題背景
  • 代碼細節
  • 更進一步
  • 總結

問題:對于超大的 string V8不能支持

問題背景

在 Nodejs 計算服務中,對端上上報的內存信息二進制數據進行預處理+緩存時,遇到了一個奇怪的報錯:RangeError: Invalid string length 。根據該報錯信息,查找得知是字符串長度超過了 node.js 的限制,即 2^29-1 (約 5 億+)個字符。整體流程如圖所示。

關于 node.js string 的長度上限,主要和 V8 引擎「壓縮指針」技術有關。按個人理解,其通過壓縮指向變量的地址(64 位)中固定的 32 位的方式,從而減少引擎的內存占用。

代碼細節

由于需要快速訪問某地址,因此緩存的數據結構必須是個對象,即 INodeGraph。具體結構如下:

  type IAddr = string;// 內存圖譜  declare interface INodeGraph {    [addr: IAddr]: IParsedNode;  }// 內存節點信息  declare interface IParsedNode {    addr: IAddr;    // size, nodeType 等輔助信息    parentNodeAddr: IAddr[]; // addr    childNodeAddr: string[]; // addr    edgeMap: {      [addr: IAddr]: {// 當前節點與父子節點之間的邊(關系)的信息      };    };  }

我們目的很明確,就是實現這樣一個 js 大對象的持久化存儲,并且能夠方便快速的轉回 js object。為解決此問題,首先想到的能否利用 protobuf 替代 JSON 實現持久化。可惜的是 protobuf 并不適用于動態 key 的場景,它適用于處理數組中存儲多個相似結構對象的數據結構。

隨后嘗試了減少對象中不必要的信息,即縮短對象的固定 key,例如用「pNode」取代冗長的「parentNodeAddr」。對于一個百萬個鍵值對的 object 而言,雖然犧牲了代碼的可讀性,但在實際的 case 中,能承載的鍵值對數量大約多了 20%。
事實上回過頭來看,更好的處理方式或許是用另外的 Map 存儲對象的 key。例如 : 將nodeGraph.parentNodeAddr這個 key 最大程度縮短為nodeGraph.p

聲明 const GraphKey = { parentNodeAddr: 'p' } 保存一個 key 的映射,需要訪問某屬性時,使用nodeGraph[GraphKey.parentNodeAddr]

更進一步

上述手段只是治標不治本,對于 key 更多的大對象并不能徹底解決問題。因此在不改變項目整體架構的前提下(如使用圖數據庫/改用 go 開發等),提出以下兩個最終方案:

方案 1:借助 Node.js C++ Addons 的能力,繞開 js string 的限制,將相關序列化邏輯交給 C++ 處理,并直接將處理好的引用樹 js object 進行后續處理。

  • 優勢:如果能實現,性能會獲得優先提升;擴展了 Node.js 的能力
  • 劣勢:實現難度大;維護可能是個問題

方案 2:生成引用樹緩存時,拆分為多個較小的對象,分別進行序列化和存儲,使用時再合并為一個大對象。

  • 優勢:無需 C++ 側開發,難度更小;維護方便
  • 劣勢:合并對象需要額外的時間,這一步驟可能會讓未命中緩存時的首次請求更慢

總結

到此這篇關于NodeJs超長字符串問題處理的文章就介紹到這了,更多相關NodeJs字符串問題處理內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: JavaScript
主站蜘蛛池模板: 欧美在线观看免费一区视频 | mimiai网址| 国产呦精品系列在线 | 久久欧美精品欧美九久欧美 | julia中文字幕久久亚洲 | 国产日韩一区 | 欧美特级限制片高清 | 97精品国产自在现线免费 | 国产在线干 | 中文字幕一区二区三区不卡 | 日产国产欧美韩国在线 | 欧美视频在线观看网站 | 美国免费一级片 | 亚洲国产精品aaa一区 | 欧美做a一级视频免费观看 欧美做a欧美 | 男女自偷自拍视频免费观看篇 | 国产麻豆视频免费观看 | 九九99香蕉在线视频网站 | 久久成人18 | 黄色片免费看视频 | 一个人看的ww免费视频 | 精品国产综合区久久久久99 | 1000部末满18在线观看黄 | 1024视频色版在线网站 | 伊人丁香花久久爱综合 | 在线不卡一区二区 | 久久99综合国产精品亚洲首页 | 成人国产一区二区三区精品 | 欧美三级在线看中文字幕 | 国产精选 桃色阁 | 王色在线观看视频 | 久久成人精品视频 | 青草视频在线观看免费视频 | 成人性色生活片全黄 | 成人av在线播放 | 亚洲欧美一区二区三区在线 | 中文字幕婷婷 | 国产精品麻豆传媒 | 国产一级做a爰片... | 久久男人 | 欧美精品日本一级特黄 |