Javascript 寻求有关解决节点内存问题的指导
我正在尝试使用node、socket.io和redis实现一个消息队列。我正试图遵循概述的可靠队列模式。我正在尝试逐行读取一个大小为60M的日志文件,稍后将对此进行更改,并将这些行泵入队列以便稍后处理。但是,我遇到了内存分配问题。我不知道如何解决这个问题,并希望从哪里开始一些指导。我不知道问题是在读取文件还是在redis客户端。我已经能够像这样一个接一个地将消息添加到队列中:Javascript 寻求有关解决节点内存问题的指导,javascript,node.js,redis,socket.io,node-redis,Javascript,Node.js,Redis,Socket.io,Node Redis,我正在尝试使用node、socket.io和redis实现一个消息队列。我正试图遵循概述的可靠队列模式。我正在尝试逐行读取一个大小为60M的日志文件,稍后将对此进行更改,并将这些行泵入队列以便稍后处理。但是,我遇到了内存分配问题。我不知道如何解决这个问题,并希望从哪里开始一些指导。我不知道问题是在读取文件还是在redis客户端。我已经能够像这样一个接一个地将消息添加到队列中: socket.emit('message', 'some sort of log line here'); 因此,我知
socket.emit('message', 'some sort of log line here');
因此,我知道侦听器正在工作,但当我运行socketClient.js文件时,它会旋转一段时间,然后最终失败,并显示以下一般错误消息:
致命错误:JS分配失败-进程内存不足
我是否可以添加一些错误处理或分析,以获得有关失败位置的更多信息
代码如下:
socketListener.js
var util = require("util"),
redis = require("redis"),
io = require('socket.io').listen(8088)
client = redis.createClient("7777", "localhost");
util.log("Established connection to redis");
io.sockets.on('connection', function(socket) {
util.log("socket connection established for socket : " + socket);
socket.on('message', function (data) {
util.log("received the following data : ");
util.log(JSON.stringify(data, 0, 3));
client.on("error", function(err) {
util.log("Error " + err);
});
try {
// reliable queue pattern implementation
util.log("queuing up the data in the list");
client.rpush('logList', data);
client.brpoplpush('logList', 'dequeueList', 10);
} catch (err) {
util.log("An error occurred : ");
util.log(JSON.stringify(err, 0, 3));
}
});
socket.on('disconnect', function() {});
});
socketClient.js
var io = require("socket.io-client");
var socket = io.connect('http://localhost:8088');
var redis = require('redis');
var util = require('util');
var fs = require('fs');
var readline = require('readline');
socket.on('connect', function() {
client = redis.createClient("7777", "localhost");
var rd = readline.createInterface({
input: fs.createReadStream('someLogFile.log'),
terminal: false
});
rd.on('line', function(line) {
util.log("reading line " + line);
socket.emit('message', line);
});
client.lrange('dequeueList', 0, -1, function(err, results) {
if (err) {
util.log(err);
} else {
var multi = client.multi();
for (var i=0; i < results.length; i++) {
util.log('got : ' + results[i]);
multi.hgetall(results[i]);
}
multi.exec(function(err, logs) {
util.log("executing the multi commands");
util.log(JSON.stringify(logs, 0 ,3));
})
};
});
})
提前感谢您的帮助 你试过节点检查器了吗@Cybermaxs Betclic出于某种原因,我没有想到这个工具。我以前在调试web api时使用过它,但在这种情况下没有想到它。谢谢