iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >NodeJs超长字符串问题如何处理
  • 293
分享到

NodeJs超长字符串问题如何处理

2023-07-05 05:07:37 293人浏览 安东尼
摘要

本文小编为大家详细介绍“nodejs超长字符串问题如何处理”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs超长字符串问题如何处理”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。问题:对于超大的 stri

本文小编为大家详细介绍“nodejs超长字符串问题如何处理”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs超长字符串问题如何处理”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

问题:对于超大的 string V8不能支持

问题背景

在 Nodejs 计算服务中,对端上上报的内存信息二进制数据进行预处理+缓存时,遇到了一个奇怪的报错:RangeError: Invalid string length 。根据该报错信息,查找得知是字符串长度超过了 node.js 的限制,即 2^29-1 (约 5 亿+)个字符。整体流程如图所示。

关于 node.js string 的长度上限,主要和 V8 引擎「压缩指针」技术有关。按个人理解,其通过压缩指向变量的地址(64 位)中固定的 32 位的方式,从而减少引擎的内存占用。

NodeJs超长字符串问题如何处理

代码细节

由于需要快速访问某地址,因此缓存的数据结构必须是个对象,即 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超长字符串问题如何处理”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: NodeJs超长字符串问题如何处理

本文链接: https://www.lsjlt.com/news/349463.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • NodeJs超长字符串问题如何处理
    本文小编为大家详细介绍“NodeJs超长字符串问题如何处理”,内容详细,步骤清晰,细节处理妥当,希望这篇“NodeJs超长字符串问题如何处理”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。问题:对于超大的 stri...
    99+
    2023-07-05
  • JavaScript字符串的长度问题
    目录字符串的长度 length1.测量字符串长度:length属性2.字符索引:[]方法3.获取指定位置字符:charAt()方法和CharCodeAt()方法4.字符串连接:con...
    99+
    2023-02-10
    JavaScript字符串 字符串的长度 JS字符串长度
  • 批处理如何判断字符串长度
    这篇文章主要介绍了批处理如何判断字符串长度,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。习题1.1 字符串长度不超过80。不含特殊字符 例 i like the bathom...
    99+
    2023-06-08
  • 批处理如何计算字符串的长度
    这篇文章主要为大家展示了“批处理如何计算字符串的长度”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“批处理如何计算字符串的长度”这篇文章吧。代码如下:@echo off & setloca...
    99+
    2023-06-08
  • 如何在Python中处理字符串操作的问题
    如何在Python中处理字符串操作的问题Python作为一种高级编程语言,具有强大的字符串处理能力。在日常开发中,字符串操作是非常常见的操作之一。本文将介绍如何在Python中高效地处理字符串,同时附带具体的代码示例。字符串的拼接和格式化字...
    99+
    2023-10-22
    字符串处理 Python字符串操作 字符串处理技巧
  • 如何使用批处理计算字符串的长度
    这篇文章给大家分享的是有关如何使用批处理计算字符串的长度的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。代码如下:@echo off & setlocal EnableDelayedExpansion ::...
    99+
    2023-06-08
  • C++中字符串处理问题的详解
    C++中字符串处理问题的详解在C++编程中,字符串处理是一个非常常见的任务。无论是读取用户输入、从文件中读取数据、或者进行数据处理和格式转换,字符串处理都扮演了重要的角色。本文将介绍C++中常见的字符串处理问题,并提供具体的代码示例。字符串...
    99+
    2023-10-22
    C++ 字符串处理 问题详解
  • python如何处理字符串
    这篇文章主要为大家展示了“python如何处理字符串”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python如何处理字符串”这篇文章吧。字符串处理技巧1. 清理用户输入对输入的的值进行清理处理...
    99+
    2023-06-27
  • php如何解决同样的字符串长度不一样问题
    PHP是一种广泛使用的服务端脚本语言,用来生成动态网页。在PHP中,字符串是一个经常使用的数据类型,但在处理一些字符串的时候,可能会出现同样字符串长度不一样的情况。在本文中,我们将探讨这个问题的原因以及如何解决它。字符编码问题在PHP中,字...
    99+
    2023-05-14
    php php字符串
  • oracle拼接字符串过长问题怎么解决
    当Oracle拼接字符串过长时,可以使用以下方法来解决: 使用SUBSTR函数截断字符串:可以使用SUBSTR函数来截断过长的字符...
    99+
    2024-04-09
    oracle
  • C++中字符串处理问题的解决方法
    C++中字符串处理问题的解决方法概述:在C++编程中,字符串的处理是一个常见的问题,涉及到字符串的截取、拼接、查找、替换等操作。本文将介绍几种常用的解决方法,并提供具体的代码示例。一、字符串截取字符串截取是指从一个字符串中获取一部分子串。在...
    99+
    2023-10-22
    C++ 解决方法 字符串处理
  • c++中如何求字符串长度
    c++ 中字符串长度可通过以下两种方法获取:1. 使用 strlen() 函数,将 c++ 字符串转换为 c 风格字符串后再求长度。2. 使用 std::string 类的 size()...
    99+
    2024-05-12
    c++ 标准库
  • Linux下mysql字符集问题如何处理
    小编给大家分享一下Linux下mysql字符集问题如何处理,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!4.1之前的 MySQL...
    99+
    2024-04-02
  • Shell如何获取字符串长度
    这篇文章主要介绍Shell如何获取字符串长度,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!方法如下:【方法一】:利用${#str}来获取字符串的长度【方法二】:利用awk的length方法备注:  ...
    99+
    2023-06-09
  • PHP如何获取字符串长度
    这篇文章将为大家详细讲解有关PHP如何获取字符串长度,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。获取 PHP 字符串长度 PHP 提供多种方法来获取字符串长度,具体取决于您的需求。 1. strlen(...
    99+
    2024-04-02
  • java如何获取字符串长度
    这篇文章主要讲解了“java如何获取字符串长度”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java如何获取字符串长度”吧!在java中,可以利用String类的length()方法来获取字...
    99+
    2023-06-20
  • python如何获取字符串长度
    要获取字符串的长度,可以使用len()函数,该函数会返回字符串中字符的数量。下面是一个示例代码:```pythonstring = ...
    99+
    2023-09-27
    python
  • php如何处理非法字符串
    在php中使用str_replace()函数对非法字符串进行处理,具体方法如下:str_replace()函数作用:php中str_replace()函数的作用是用于替换字符串中的字符。str_replace()函数语法:str_repla...
    99+
    2024-04-02
  • PHP如何处理中文字符编码问题
    PHP如何处理中文字符编码问题,需要具体代码示例 在开发PHP应用程序时,处理中文字符编码问题是一个常见的挑战。特别是在处理用户输入、数据库操作以及输出到网页等场景中,正确处理中文字符...
    99+
    2024-04-02
  • json特殊字符串如何处理
    在处理 JSON 中的特殊字符串时,可以使用以下方法:1. 转义特殊字符:对于包含特殊字符的字符串,可以使用反斜杠(\)来转义它们。...
    99+
    2023-09-12
    json
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作