Mar*_*ark 24 javascript mongodb node.js
我想在大型阵列上进行复杂的CPU密集型工作.理想情况下,我想将此传递给子进程.
var spawn = require('child_process').spawn;
// dataAsNumbers is a large 2D array
var child = spawn(process.execPath, ['/child_process_scripts/getStatistics', dataAsNumbers]);
child.stdout.on('data', function(data){
console.log('from child: ', data.toString());
});
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时,node会给出错误:
产生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());
});
Run Code Online (Sandbox Code Playgroud)
然后在getStatistics.js中:
console.log('im inside child');
process.stdin.on('data', function(data) {
console.log('data is ', data);
process.exit(0);
});
Run Code Online (Sandbox Code Playgroud)
但是process.stdin.on没有达到回调.如何在我的子脚本中接收流?
编辑
我不得不放弃缓冲方法.现在我将数组作为消息发送:
var cp = require('child_process');
var child = cp.fork('/getStatistics.js');
child.send({
dataAsNumbers: dataAsNumbers
});
Run Code Online (Sandbox Code Playgroud)
但这仅在dataAsNumber的长度低于约20,000时才有效,否则超时.
rvi*_*hne 11
有了这么大量的数据,我会研究使用共享内存而不是将数据复制到子进程(这是使用管道或传递消息时发生的情况).这将节省内存,减少父进程的CPU时间,并且不太可能遇到某些限制.
shm-typed-array是一个非常简单的模块,似乎适合您的应用程序.例:
parent.js
"use strict";
const shm = require('shm-typed-array');
const fork = require('child_process').fork;
// Create shared memory
const SIZE = 20000000;
const data = shm.create(SIZE, 'Float64Array');
// Fill with dummy data
Array.prototype.fill.call(data, 1);
// Spawn child, set up communication, and give shared memory
const child = fork("child.js");
child.on('message', sum => {
console.log(`Got answer: ${sum}`);
// Demo only; ideally you'd re-use the same child
child.kill();
});
child.send(data.key);
Run Code Online (Sandbox Code Playgroud)
child.js
"use strict";
const shm = require('shm-typed-array');
process.on('message', key => {
// Get access to shared memory
const data = shm.get(key, 'Float64Array');
// Perform processing
const sum = Array.prototype.reduce.call(data, (a, b) => a + b, 0);
// Return processed data
process.send(sum);
});
Run Code Online (Sandbox Code Playgroud)
请注意,我们只是通过IPC从父进程向子进程发送一个小"密钥",而不是整个数据.因此,我们节省了大量的记忆和时间.
当然,您可以将'Float64Array'(例如a double)更改为应用程序所需的任何类型数组.请注意,此库特别只处理一维类型数组; 但这应该只是一个小障碍.
| 归档时间: |
|
| 查看次数: |
5427 次 |
| 最近记录: |