Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

nodeJs huge array processing throws RangeError: Maximum call stack size exceeded

This is part of code to proceed big number of entries ( originally its works with file system and make some operations with files) . Is there any nice way to bypass the limitation and prevent throwing of RangeError: Maximum call stack size exceeded ( As for now it allows me to iterate about 3000 items )

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))
like image 382
Alber Avatar asked Nov 27 '13 13:11

Alber


2 Answers

The problem is that you are making to many function calls. Setting the stack-size to a higher value will only increase the number of items you can handle, not solve the actual problem.

You are calling the next iteration straight from your function, which makes it a recursive function. It's a bit hard to spot since it's going thru async.

This code should work:

var tifPreview = function (item, callback) {
  console.log(item);

  // defer the callback
  setImmediate(callback);
}

Read more about the setImmediate function here: http://nodejs.org/api/timers.html#timers_setimmediate_callback_arg

like image 153
Linus Unnebäck Avatar answered Sep 19 '22 19:09

Linus Unnebäck


An option could be passing --max-stack-size to node.

node --max-stack-size 32000 app.js

For reference, use node -h

--max-stack-size=val set max v8 stack size (bytes)

Update

Even though help prints it as --max-stack-size, in node -v v0.10.x+ you need to use --stack-size instead.

node --stack-size=32000 app.js
like image 22
bevacqua Avatar answered Sep 22 '22 19:09

bevacqua