【问题标题】:V8 crashes due to memory after running traversal in loop在循环中运行遍历后,V8 因内存而崩溃
【发布时间】:2019-02-05 16:10:22
【问题描述】:

我在 arangoDB 3.3.11 下运行 Foxx 应用程序。以类似的方式进行了压力测试;

var traverser=new traversal.Traverser(config);

//Loop through an list of entities and do traversal on each of them
BigArray.forEach(function(e){
var vertex=db._document(e);
traverser.traverse(result,vertex)
})

遍历本身并没有什么特别之处,除了它的config.visitor 当且仅当满足某些条件时才会推送顶点。

config.visitor=function(config,result,vertex,path){
//Write a vertex if conditions are right. Vertex normal size json object
if(hashTable[vertex.id])
result.push(vertex);

}

这样,内存慢慢积累,崩溃并返回canceled request

{"error":true,"errorMessage":"canceled request","code":410,"errorNum":21}

连同堆大小警告

reached heap-size limit, interrupting V8 execution (heap size limit 3254779904, used 3140128304)

在循环中使用遍历有什么注意事项吗?使用小数组,应用程序仍然可以工作,但是使用复杂且足够大的数组,就会发生错误。我一直认为每次遍历都是一个独立的函数,在每次迭代中,GC 会自行扫描并管理内存。

【问题讨论】:

    标签: traversal arangodb foxx


    【解决方案1】:

    请使用AQL traversals 以获得更好的性能和更少的 V8 执行限制。

    V8 对字符串有 256 MB 的限制,似乎对于较大的遍历,这个限制可能会受到旧的遍历实现的影响,遗憾的是我们对此无能为力。

    其他用户have had similar observations

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-14
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      相关资源
      最近更新 更多