このように大量のデータがあるので、共有メモリ<の使用を検討します。 / strong> データを子プロセスにコピーするのではなく(パイプを使用したりメッセージを渡したりするときに発生します)。これにより、メモリが節約され、親プロセスにかかる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);
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);
});
データ全体ではなく、IPCを介して親から子プロセスに小さな「キー」を送信するだけであることに注意してください。したがって、大量のメモリと時間を節約できます。
もちろん、'Float64Array'
を変更することもできます (例:double
)型付き配列
アプリケーションに必要です。特にこのライブラリは、1次元の型付き配列のみを処理することに注意してください。しかし、それは小さな障害にすぎないはずです。