最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

NodeJs超長字符串問題處理的詳細(xì)分析

 更新時間:2023年02月20日 11:39:16   作者:地鐵程序員  
這篇文章主要給大家介紹了關(guān)于NodeJs超長字符串問題處理的詳細(xì)分析,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

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

問題背景

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

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

代碼細(xì)節(jié)

由于需要快速訪問某地址,因此緩存的數(shù)據(jù)結(jié)構(gòu)必須是個對象,即 INodeGraph。具體結(jié)構(gòu)如下:

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

我們目的很明確,就是實現(xiàn)這樣一個 js 大對象的持久化存儲,并且能夠方便快速的轉(zhuǎn)回 js object。為解決此問題,首先想到的能否利用 protobuf 替代 JSON 實現(xiàn)持久化??上У氖?protobuf 并不適用于動態(tài) key 的場景,它適用于處理數(shù)組中存儲多個相似結(jié)構(gòu)對象的數(shù)據(jù)結(jié)構(gòu)。

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

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

更進(jìn)一步

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

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

  • 優(yōu)勢:如果能實現(xiàn),性能會獲得優(yōu)先提升;擴展了 Node.js 的能力
  • 劣勢:實現(xiàn)難度大;維護(hù)可能是個問題

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

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

總結(jié)

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

相關(guān)文章

  • node.js使用stream模塊實現(xiàn)自定義流示例

    node.js使用stream模塊實現(xiàn)自定義流示例

    這篇文章主要介紹了node.js使用stream模塊實現(xiàn)自定義流,結(jié)合實例形式詳細(xì)分析了node.js基于stream模塊實現(xiàn)自定義的可讀流、可寫流、可讀寫流等相關(guān)操作技巧,需要的朋友可以參考下
    2020-02-02
  • mongoose中利用populate處理嵌套的方法

    mongoose中利用populate處理嵌套的方法

    這篇文章主要給大家介紹了關(guān)于mongoose中利用populate處理嵌套的方法,文中通過示例代碼介紹的非常詳細(xì),對大家具有一的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-05-05
  • nodejs express配置自簽名https服務(wù)器的方法

    nodejs express配置自簽名https服務(wù)器的方法

    這篇文章主要介紹了nodejs express配置自簽名https服務(wù)器的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • 詳解nodejs 配置文件處理方案

    詳解nodejs 配置文件處理方案

    這篇文章主要介紹了詳解nodejs 配置文件處理方案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • 詳解Node.js包的工程目錄與NPM包管理器的使用

    詳解Node.js包的工程目錄與NPM包管理器的使用

    這篇文章主要介紹了Node.js包的工程目錄與NPM包管理器的使用,可以幫助編程者更好地組織Node.js代碼文件,需要的朋友可以參考下
    2016-02-02
  • Node.js連接mongo數(shù)據(jù)庫上傳文件的方法步驟

    Node.js連接mongo數(shù)據(jù)庫上傳文件的方法步驟

    本文主要介紹了Node.js連接mongo數(shù)據(jù)庫上傳文件的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Yarn的安裝與使用詳細(xì)介紹

    Yarn的安裝與使用詳細(xì)介紹

    不知道大家有沒有覺察到Facebook近年大招頻出。Yarn是Facebook最近發(fā)布的一款依賴包安裝工具。Yarn是一個新的快速安全可信賴的可以替代NPM的依賴管理工具,Yarn正式發(fā)布沒幾天已經(jīng)迅速達(dá)到了數(shù)萬贊,就可以知道大家苦NPM久已。這篇文章將詳細(xì)介紹Yarn的安裝與使用。
    2016-10-10
  • Node.js 使用AngularJS的方法示例

    Node.js 使用AngularJS的方法示例

    這篇文章主要介紹了Node.js 使用AngularJS的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Node.js服務(wù)器環(huán)境下使用Mock.js攔截AJAX請求的教程

    Node.js服務(wù)器環(huán)境下使用Mock.js攔截AJAX請求的教程

    Mock.js這個JavaScript庫最常見的用法便是被用來攔截AJAX請求,well,這里我們就來看一下Node.js服務(wù)器環(huán)境下使用Mock.js攔截AJAX請求的教程:
    2016-05-05
  • Node koa服務(wù)器實現(xiàn)獲取客戶端ip

    Node koa服務(wù)器實現(xiàn)獲取客戶端ip

    這篇文章主要為大家詳細(xì)介紹了Node koa服務(wù)器實現(xiàn)獲取客戶端ip的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解下
    2025-02-02

最新評論

临夏市| 宕昌县| 临潭县| 穆棱市| 蒙阴县| 芦山县| 合阳县| 奈曼旗| 黔东| 台中市| 满洲里市| 沙洋县| 娄烦县| 牟定县| 炎陵县| 广灵县| 电白县| 赣州市| 方山县| 札达县| 汝南县| 静乐县| 浏阳市| 玛沁县| 昆明市| 松原市| 襄樊市| 南岸区| 安远县| 澄迈县| 姚安县| 莎车县| 青冈县| 绩溪县| 田东县| 河北省| 临安市| 三门峡市| 秦安县| 多伦县| 莆田市|