sql >> Databasteknik >  >> NoSQL >> MongoDB

Skicka stor array till nod underordnad process

Med en sådan enorm mängd data skulle jag överväga att använda delat minne istället för att kopiera data till den underordnade processen (vilket är vad som händer när du använder ett rör eller skickar meddelanden). Detta sparar minne, tar mindre CPU-tid för den överordnade processen och kommer sannolikt inte att stöta på någon gräns.

shm-typed-array är en mycket enkel modul som verkar passa din applikation. Exempel:

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);
});

Observera att vi bara skickar en liten "nyckel" från föräldern till den underordnade processen via IPC, inte hela data. Således sparar vi massor av minne och tid.

Naturligtvis kan du ändra 'Float64Array' (t.ex. en double ) till vilken skriven array än din ansökan kräver. Observera att detta bibliotek i synnerhet endast hanterar endimensionella typmatriser; men det borde bara vara ett mindre hinder.



  1. MongoDB hitta underdokument och sortera resultaten

  2. Golang och MongoDb fjärråtkomst misslyckas (servern returnerade fel i SASL-autentiseringssteget:Autentisering misslyckades.)

  3. MongoDb-frågor och system.linq

  4. Stöder azure saker som mongodb och redis?