Với lượng dữ liệu khổng lồ như vậy, tôi sẽ xem xét việc sử dụng bộ nhớ dùng chung chứ không phải sao chép dữ liệu vào quy trình con (đó là những gì đang xảy ra khi bạn sử dụng đường dẫn hoặc chuyển thông báo). Điều này sẽ tiết kiệm bộ nhớ, tốn ít thời gian CPU hơn cho quy trình chính và không có khả năng đạt đến một số giới hạn.
shm-typed-array
là một mô-đun rất đơn giản có vẻ phù hợp với ứng dụng của bạn. Ví dụ:
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);
});
Lưu ý rằng chúng tôi chỉ gửi một "khóa" nhỏ từ quy trình mẹ đến quy trình con thông qua IPC, không phải toàn bộ dữ liệu. Do đó, chúng tôi tiết kiệm được rất nhiều bộ nhớ và thời gian.
Tất nhiên, bạn có thể thay đổi 'Float64Array'
(ví dụ:một double
) với bất kỳ mảng đã nhập
ứng dụng của bạn yêu cầu. Lưu ý rằng thư viện này đặc biệt chỉ xử lý các mảng được đánh một chiều; nhưng đó chỉ là một trở ngại nhỏ.