堆栈溢出怎么解决,网页堆栈溢出怎么解决

本文分享自华为云社区《》,作者:蜉蝣与海。导读&简介查询语言(QueryLanguage)的出现方便了用户在计算引擎上执行各种操作,就图数据库而言,neo4j支持查询语言cypher,nebula有其

本文分享自华为云社区《》,作者:蜉蝣与海 。

导读&简介

查询语言(Query Language)的出现方便了用户在计算引擎上执行各种操作,就图数据库而言,neo4j支持查询语言cypher,nebula有其独有的查询语言nGQL。由于查询语言规则依赖语言自身文法,用户使用查询语言自由度较大,输入灵活,一般测试手段难以覆盖到所有情况,所以在某种程度上复杂的查询语句是各类计算产品健壮性的试金石,本文归纳了两个开源产品pr(pull request)时修复的堆栈溢出问题,并试着写写通过阅读pr中的问题而得到的一些启发。

堆栈溢出怎么解决

先上链接,如果你更喜欢读代码而不是听我叨叨:

StackOverFlowError 在减少 List(neo4j) 时发生:

win7堆栈溢出解决方法:打开常用的浏览器,这个方法适用于所有的浏览器。所以不用担心会出现状况。找到菜单栏,在菜单栏上面存在一个"工具"选项,单击工具这个按钮。在"工具"这个选项下面有个"Internet选项",点击这个功能选项。

问题:

公关:

修复表达式超过深度(星云)时崩溃的问题:

代码分析

在这两个PR中都提到了StackOverFlow。我们先试着描述一下问题,Nebula的pr要稍微好懂一点:

可以试着打开测试用例来看之前有问题的语句,是一堆 1+1+1+...+1+1

结果, 当+1+1这样的语法要素出现的次数太多时,会报栈溢出。通过阅读parser.yy可以看到,对于每个加法符号,都会生成一个表达式对象:

解析器.yy

expression_internal

constant_expression {

$$ = $1;

} ...

|expression_internal加expression_internal{

$$ = ArithmeticExpression::makeAdd(qctx->objPool(), $1, $3);

win7堆栈溢出解决方法:打开常用的浏览器,这个方法适用于所有的浏览器。所以不用担心会出现状况。找到菜单栏,在菜单栏上面存在一个"工具"选项,单击工具这个按钮。在"工具"这个选项下面有个"Internet选项",点击这个功能选项。

}

static ArithmeticExpression* makeAdd(ObjectPool* pool。

表达式* lhs = nullptr。

表达式* rhs = nullptr) {

return pool->add(new ArithmeticExpression(pool, Expression::Kind::kAdd, lhs, rhs));

堆栈溢出怎么解决

}

对于像&34;这样的表达式,调用栈就会成这样:

当用户输入的+1的数目比较多时,头部表达式下就会链式挂载若干个子表达式,如果在语法解析层和语法执行层没有对表达式做特殊的处理,这些子链会被递归调用(即父表达式会调用子表达式),递归的深度取决于子链的数目。

电脑中无法打开网页并提示堆栈溢出的原因分析及解决方法 1、函数调用层次过深,每调用一次,函数的参数、局部变量等信息就压一次栈; 2、局部静态变量体积太大。 解决方法: 1、按win+r打开运行,输入cmd,并按回车; 。

neo4j的issue有些小众,其关注的是对这样自定义聚集操作的语句:

放卷范围(0,15000) 为 XXX

堆栈溢出怎么解决

使用 collect([xxx]) 作为 set1

使用 reduce(c = [], set1 中的 x| c + x) 作为 fromNodes

一、加大堆栈空间。二、减少堆栈使用的深度。

从节点展开为 x 返回 x

其中range(0,15000)会生成一个列表,共15000个元素,如[0,1,2,...,14998,14999]这样。unwind会对这个链表进行展开,通过collect([xxx])对每个元素生成一个独立的列表并打包成set1([0],[1],...[14998],[14999]),然后通过reduce操作对这些独立的元素进行拼接。问题就是出在拼接的时候:reduce看起来是不断在进行foreach(x in set1){c = c + x}这样的操作,然而实际代码实现时,对15000个元素进行了展开,生成的是c=x0+x1+x2+...+x14999。并没有使用一个变量去缓存c的中间状态,而是试图通过不断的二元计算直接算出c的结果。代码如下:

CypherMath.Addif ( lhsIsListValue &&rhs instanceof ListValue ){返回 VirtualValues.concat( (ListValue) lhs, (ListValue) rhs );}VirtualValues.concatpublic static ListValue concat( ListValue...列表 ){返回新的 ListValue.ConcatList( lists);}

电脑提示“堆栈溢出,位置:第1行”,这种情况一般是浏览器在往内存中加载数据,数据在内存堆栈中溢出导致的,可通过清除浏览器缓存来解决,具体操作方法如下:1、 打开浏览器,点击右侧更多,在下拉框中选择“工具”。

这样会有15000个ConcatList链式连接,实际计算时15000个ConcatList被递归调用,生成了一个深为15000的函数调用栈。

上述代码的问题和PR中的解决方案

可以看到,不管是C++的nebula,还是java写的neo4j,通过巧妙地构造查询语句,都可以使得内部执行时生成深度较深的函数调用栈。而函数调用栈的深度,在不同编程语言下都是有限制的(大部分查询语言栈空间是M级的,参见附录[1]和附录[2])。超过这个限制,轻则直接导致语句崩溃,如果系统的异常处理机制不够完善,也可能导致更严重的问题。

neo4j更新list的代码,解析语句阶段,原始list调用add方法,会生成一个包含value元素的新的list,这个新list会替换调原始的list

公共列表值添加(列表值值)

{var newSize = lists.length + 1;var newArray = new ListValue[newSize];System.arraycopy( lists,0,newArray,0,lists.length );newArray[lists.length] = value;return new ConcatList( newArray);}

PR带来的启示

在查询语言的解析和计划执行的编码设计阶段,为查询语句中的某个语法成分(如表达式、函数、子句)编写执行逻辑的代码往往是相对直观且易于理解的。比如加法操作可以直接构造一个ArithmeticExpression对象,List拼接可以直接构造一个ConcatList对象。然而由于用户输入的不确定性,需要考虑多个语法成分联动,或者某几个语法成分批量出现时带来的问题(例如深度过深的递归)。要么像nebula一样在量上做限制,量太大直接报错;要么像neo4j一样针对每个会因为批量联动带来问题的点给出不会出错的编码设计。通过这两种手段,可以减少极端语句对系统的影响,提高系统的健壮性。

附录

[1]C++函数调用栈溢出演示:

[2]JVM StackOverFlow和OOM 场景模拟:

解决方法有几个:-修改编译配置,增大栈空间 -避免不必要的嵌套、频繁调用子程序,比如避免使用递归调用、多重嵌套 -避免在子程序中开设局部大容量变量,如果需要,可以考虑开设成全局变量,或临时使用公用全局变量计算 。

上一篇 2023年02月10 00:01
下一篇 2023年01月30 00:27

相关推荐

  • 怎么看qq注册多少天了,2022qq查看注册天数

    说起QQ,相信是很多80后90后的青春回忆,2022qq查看注册天数,从1999年发布的OICQ到当前最新版的QQ,腾讯QQ已经伴随我们走过了23年的春夏秋冬,你还记得自己的QQ是什么时候注册的吗?查

    2023年01月12 233
  • 付呗怎么样,付呗收款码是正规的吗

    聚合支付作为一种新兴的支付方式,不同于微信支付、支付宝支付,不是与单一APP对接的,而是将微信、支付宝、京东等一些主流的支付平台进行集合汇成一个收款二维码,无论消费者使用哪个平台都可以搞定。就像一个多

    2023年01月30 206
  • qq忘记账号怎么办,以前qq账号不记得了怎么办

    6月26日晚疑似出现大面积QQ盗号现象只要绑定有密保手机才能找回来的首先打开手机QQ,选择手机号登录这里会列出所有绑定在此手机下的QQ号,选择忘记账号的QQ进行登录这时候打开抓包软件,抓取期间的数据,

    2023年01月22 215
  • 怎么上pixiv,pixiv进入

    插画师学习网站有哪些?插画师一般逛哪些设计网站?有哪些适合插画师使用的网站?想必这些问题都是绘画初学者们比较伤脑筋的问题,那么新手插画师必备的学习平台有哪些?今天灵猫课堂老师就在网络上收集整理了关于插

    2023年02月05 253
  • ahci驱动怎么安装,win10自带ahci驱动吗

    有用户说,电脑原本只有一块机械硬盘,加装一块固态硬盘后,想要把系统安装在固态上,选AHCI安装不了,而将硬盘模式修改为IDE之后就可以了,这是哪里出了问题呢?针对这个问题,老毛桃来教大家用排除法找出问

    2023年02月05 279
  • img怎么打开,手机怎么查看img格式文件

    手机怎么查看img格式文件,众所周知,PDF的格式对于一些重要文件的保存,以及隐私文件的保护来说都是非常好用的。同时,如果要将PDF格式的文件转换成其它格式的文件也挺方便的。因此,PDF格式在日常办公

    2023年02月04 214
  • word怎么画虚线,word表格设置内部绘制虚线

    平时我们在使用Word来编写文字文档的时候,我们往往会需要进行一些排版,才能够让文档中众多的文字看起来更加美观整齐,而又简单干净。而在排版的过程当中,我们经常会使用到虚线,word表格设置内部绘制虚线

    2023年02月04 258
  • 缓存怎么清理,如何以及何时清除缓存

    说你用的智能手机用的时间久了之后,是不是也会出现又卡顿又慢的现象?尤其是安卓手机?那相信,大家也知道,手机变卡变慢的原因都是因为呀,都是因为我们手机上下载了大量的软件app,而且每天还要浏览各种软件,

    2023年01月15 212
  • 国外网站怎么打开,手机如何翻到国外网站

    转载/苏有熊伟大的可视化有一些神奇之处,它可以为用户提供关于当前主题的全新视角。下文所提到的这些网站,将帮助你练习探索以一种有意义的方式发现数据背后的真相。01、NathanYau'sFlow

    2023年01月21 239
  • url怎么看,如何查看网页的url

    URL和URI一样吗?今天将会为大家具体介绍两者区别,希望可以帮到大家。首先,我们提前了解一个公式,让大家有个心理准备:URL+URN=URI。啥是URL?我能用它干什么?URL(统一资源定位符)是I

    2023年02月04 220
  • 微信账单怎么导出,微信收入账单怎么导出

    微信收入账单怎么导出,微信,从一开始单纯的社交软件逐渐深入生活的方方面面,伴随着微信红包、微信转账的出现,微信又成为备受青睐的新兴线上支付方式,因此,在我们日常的经济生活中,微信转账、红包记录便成为重

    2023年01月23 250
  • 怎么创建appleid

    小辰平时在自己的维修店里经常会遇到顾客让帮忙注册苹果ID帐号的情况,用appleid充值能收到信息吗,今天小辰就把苹果手机ID帐号的注册方法分享给大家。,点开手机设置,在设置里点开iCloud首先打开

    2023年02月06 218
  • 开机要按f1怎么解决,电脑开机按f1的解决方法图

    据说开机进不了系统需要按F1才能进系统,常常是因为电脑电池没有电导致,主板上纽扣电池没到导致BIOS系统不能正常运行,今天遇到一个客户电脑出现了这个问题,电脑比较老了,是一个戴尔的笔记本电脑i5一代处

    2023年02月01 295
关注微信