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