私は元々C++でビルドされたバイナリファイルを実行するシェルを起動するためにspawn-child npmパッケージを使用しています。私はStdinをバイナリに提供し、バイナリはStdoutを毎秒送信します。ノード部分では、バイナリからStdoutの受信を開始すると、私はon
リスナを持っています。これはstdout.on('data', function (data) {})
のようなもので、これらのデータをSSEチャネルに送ります。子プロセスを使用している間にNode.js仮想メモリが絶えず増加します
すべてがうまくいきますが、大きな懸念は、ノードプロセスの一定のメモリ増加です。これは、Stdinで毎回バイナリにヒットするとわかります。私は自分のコードがどのように見えるかを概説していますが、このメモリの増加を抑えるエレガントな方法があります。
var sseChannel = require('sse-channel'),
spawnCommand = require('spawn-command'),
cmd = 'path to the binary file',
globalArray = [],
uuid = require('uuid');
module.exports = function(app) {
var child = spawnCommand(cmd),
privateChannel = new sseChannel({
historySize: 0,
cors: {
origins: ['*']
},
pingInterval: 15 * 1000,
jsonEncode: false
});
srvc = {
get: function(req, res) {
globalArray[uuid.v4()] = res;
child.stdin.write('a json object in a format that is expected by binary' + '\n'); // req.query.<queryVal>
child.stdout.on('data', function(data) {
privateChannel.send(JSON.stringify(data));
});
},
delete: function(sessionID) {
var response = globalArray[sessionID];
privateChannel.removeClient(response);
response.end();
delete globalArray[sessionID];
}
}
}
このコードは、ちょうどそれがアプリでどのように見えるかを列挙することです。この場合、実行コードスニペットを押しても機能しません。
私は2回の異なる間隔でheapdumpを収集し、これは統計が見える、型指定された配列値の大幅な増加がある方法です、型付き配列の成長を維持または抑制するために何を行うことができる、
リクエストごとに 'srvc.get()'を呼び出していますか? – mscdex
うん、それは正しいです。リクエストが行われるたびに、バイナリにstdinが提供され、stdout 'on'リスナーがデータをログに記録します。 – Sai
'srvc'の有効範囲は何ですか?すべてのモジュール呼び出しで目的に合わせて上書きしていますか?フルコードをお知らせください。 – Bergi