NodeJs огромная обработка массивов throws RangeError: максимальный размер стека вызовов
Это часть кода для продолжения большого количества записей (изначально он работает с файловой системой и выполняет некоторые операции с файлами). Есть ли хороший способ обойти ограничение и предотвратить выброс RangeError: превышен максимальный размер стека вызовов
(На данный момент это позволяет мне перебирать около 3000 предметов)
var async = require('async')
, _u = require('underscore')
var tifPreview = function (item, callback) {
console.log(item)
return callback();
}
var tifQueue = async.queue(tifPreview, 2)
tifQueue.push(_u.range(0, 5000, 1))
Ответы
Ответ 1
Проблема в том, что вы делаете много вызовов функций. Установка значения stack-size
на большее значение приведет только к увеличению количества элементов, которые вы можете обрабатывать, а не к решению реальной проблемы.
Вы вызываете следующую итерацию прямо из своей функции, что делает ее рекурсивной. Это немного сложно определить, так как он проходит через async
.
Этот код должен работать:
var tifPreview = function (item, callback) {
console.log(item);
// defer the callback
setImmediate(callback);
}
Подробнее о функции setImmediate
читайте здесь:
http://nodejs.org/api/timers.html#timers_setimmediate_callback_arg
Ответ 2
Параметр может передавать --max-stack-size
в node
.
node --max-stack-size 32000 app.js
Для справки используйте node -h
--max-stack-size=val
установить max v8 размер стека (байты)
Update
Даже если help печатает его как --max-stack-size
, в node -v
v0.10.x
+ вместо этого вам нужно использовать --stack-size
.
node --stack-size=32000 app.js