将大数组传递给Node子进程

13 浏览
0 Comments

将大数组传递给Node子进程

我有一个需要在一个大数组上进行复杂的CPU密集型工作。理想情况下,我希望将其传递给子进程。

var spawn = require('child_process').spawn;
// dataAsNumbers是一个大的二维数组
var child = spawn(process.execPath, ['/child_process_scripts/getStatistics', dataAsNumbers]);
child.stdout.on('data', function(data){
  console.log('from child: ', data.toString());
});

但是当我这样做时,Node.js报错:

spawn E2BIG

我在这篇文章中找到了解决方法。

因此,将数据传输到子进程似乎是正确的方法。我的代码现在是:

var spawn = require('child_process').spawn;
console.log('creating child........................');
var options = { stdio: [null, null, null, 'pipe'] };
var args = [ '/getStatistics' ];
var child = spawn(process.execPath, args, options);
var pipe = child.stdio[3];
pipe.write(Buffer('awesome'));
child.stdout.on('data', function(data){
  console.log('from child: ', data.toString());
});

然后在getStatistics.js中:

console.log('im inside child');
process.stdin.on('data', function(data) {
  console.log('data is ', data);
  process.exit(0);
});

然而,在process.stdin.on的回调函数中无法到达。我该如何在子脚本中接收流?

编辑

我不得不放弃缓冲区的方法。现在我将数组作为消息发送:

var cp = require('child_process');
var child = cp.fork('/getStatistics.js');
child.send({ 
  dataAsNumbers: dataAsNumbers
});

但这只适用于dataAsNumbers的长度小于约20,000的情况,否则会超时。

0