sql >> データベース >  >> NoSQL >> MongoDB

大きな配列をノードの子プロセスに渡す

    このように大量のデータがあるので、共有メモリ<の使用を検討します。 / 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次元の型付き配列のみを処理することに注意してください。しかし、それは小さな障害にすぎないはずです。



    1. エラー10068で失敗しました:無効な演算子:$ oid

    2. Mongo Javaドライバーからdb.Collection.stats()を呼び出す方法

    3. mongoose.modelでコレクション名を変更するにはどうすればよいですか?

    4. <URL>へのWebSocket接続に失敗しました:WebSocketハンドシェイク中のエラー:予期しない応答コード:521