欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

NodeJs超長(zhǎng)字符串問(wèn)題處理的詳細(xì)分析

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

問(wèn)題:對(duì)于超大的 string V8不能支持

問(wèn)題背景

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

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

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

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

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

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

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

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

更進(jìn)一步

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

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

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

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

  • 優(yōu)勢(shì):無(wú)需 C++ 側(cè)開發(fā),難度更?。痪S護(hù)方便
  • 劣勢(shì):合并對(duì)象需要額外的時(shí)間,這一步驟可能會(huì)讓未命中緩存時(shí)的首次請(qǐng)求更慢

總結(jié)

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

相關(guān)文章

  • node.js中的events.EventEmitter.listenerCount方法使用說(shuō)明

    node.js中的events.EventEmitter.listenerCount方法使用說(shuō)明

    這篇文章主要介紹了node.js中的events.EventEmitter.listenerCount方法使用說(shuō)明,本文介紹了events.EventEmitter.listenerCount的方法說(shuō)明、語(yǔ)法、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Node.js+Express.js+TS實(shí)現(xiàn)簡(jiǎn)單圖床腳本

    Node.js+Express.js+TS實(shí)現(xiàn)簡(jiǎn)單圖床腳本

    在這篇博客文章中,我將介紹如何使用 TypeScript 和 Express 框架來(lái)編寫一個(gè)簡(jiǎn)單的圖床腳本,可以將本地圖片上傳到服務(wù)器,并返回圖片的 URL,這樣,你就可以在 Markdown 文檔中方便地引用圖片,而不用擔(dān)心圖片的存儲(chǔ)和管理問(wèn)題
    2023-10-10
  • Nodejs學(xué)習(xí)筆記之NET模塊

    Nodejs學(xué)習(xí)筆記之NET模塊

    之前兩篇文章基本上都是給我們介紹的nodejs的理論基礎(chǔ),今天我們來(lái)點(diǎn)干貨,先從NET模塊開始講起吧。
    2015-01-01
  • nodejs集成sqlite使用示例

    nodejs集成sqlite使用示例

    本篇文章主要介紹了nodejs集成sqlite使用示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • node.js實(shí)現(xiàn)逐行讀取文件內(nèi)容的代碼

    node.js實(shí)現(xiàn)逐行讀取文件內(nèi)容的代碼

    這篇文章主要介紹了node.js實(shí)現(xiàn)逐行讀取文件內(nèi)容的代碼,本文還介紹了一個(gè)node.js的按行讀取內(nèi)容開源項(xiàng)目,需要的朋友可以參考下
    2014-06-06
  • Node.js使用第三方插件nodemailer實(shí)現(xiàn)郵件發(fā)送示例

    Node.js使用第三方插件nodemailer實(shí)現(xiàn)郵件發(fā)送示例

    這篇文章主要為大家介紹了Node.js使用第三方插件nodemailer實(shí)現(xiàn)郵件發(fā)送示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • node.js如何根據(jù)URL返回指定的圖片詳解

    node.js如何根據(jù)URL返回指定的圖片詳解

    這篇文章主要介紹了NODE.JS如何根據(jù)URL返回指定的圖片詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • NodeJs實(shí)現(xiàn)跨域WebSocket即時(shí)通訊加強(qiáng)版

    NodeJs實(shí)現(xiàn)跨域WebSocket即時(shí)通訊加強(qiáng)版

    這篇文章主要為大家介紹了NodeJs實(shí)現(xiàn)跨域WebSocket即時(shí)通訊加強(qiáng)版示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 深入理解nodejs搭建靜態(tài)服務(wù)器(實(shí)現(xiàn)命令行)

    深入理解nodejs搭建靜態(tài)服務(wù)器(實(shí)現(xiàn)命令行)

    這篇文章主要介紹了深入理解nodejs搭建靜態(tài)服務(wù)器(實(shí)現(xiàn)命令行),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • node.js中的events.emitter.listeners方法使用說(shuō)明

    node.js中的events.emitter.listeners方法使用說(shuō)明

    這篇文章主要介紹了node.js中的events.emitter.listeners方法使用說(shuō)明,本文介紹了events.emitter.listeners 的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12

最新評(píng)論