将大数组传递给Node子进程
将大数组传递给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的情况,否则会超时。