循环运行遍历后,V8由于内存而崩溃

时间:2019-02-05 16:10:22

标签: traversal arangodb foxx

我正在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都会自行扫描并管理内存。

1 个答案:

答案 0 :(得分:1)

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

V8的字符串限制为256 MB,对于较大的遍历来说,似乎这个限制可能会被旧的遍历实现所触及,可悲的是我们对此无能为力。

其他用户have had similar observations