V8 падает из-за памяти после запуска обхода в цикле - PullRequest
0 голосов
/ 05 февраля 2019

Я запускал приложение Foxx под arangoDB 3.3.11.Стресс-тест был проведен аналогичным образом:

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)

Есть ли какие-либо предостережения при использовании обхода внутрицикл?С маленьким массивом приложение все еще работает, но с сложным и достаточно большим массивом возникает ошибка.Я всегда думал, что каждый обход - это независимая функция, и в каждой итерации сборщик мусора запускает и управляет памятью самостоятельно.

1 Ответ

0 голосов
/ 04 марта 2019

используйте AQL-обходы для лучшей производительности и меньших ограничений при выполнении V8.

V8 имеет ограничение 256 МБ для строк, и кажется, что для более крупных обходов этот предел может бытьударил по старой реализации обхода, и, к сожалению, мы мало что можем с этим поделать.

Другие пользователи имели подобные наблюдения

...