附加JSON对象而不解析它的有效方法
我编写了一个在udp端口上监听的小脚本,并将所有传入消息(一个JSON对象)存储在一个文件中。空文件包含JSON格式的数组。 我正在寻找一种有效的方法,将来自多个客户端的所有(并发)传入消息存储在这个文件中。 文件大小可以是数百兆字节。解析文件并附加新对象将无法根据需要高效地完成 你有办法吗 编辑 我的解决方案基于@t-j-crowder方法:附加JSON对象而不解析它的有效方法,json,node.js,optimization,Json,Node.js,Optimization,我编写了一个在udp端口上监听的小脚本,并将所有传入消息(一个JSON对象)存储在一个文件中。空文件包含JSON格式的数组。 我正在寻找一种有效的方法,将来自多个客户端的所有(并发)传入消息存储在这个文件中。 文件大小可以是数百兆字节。解析文件并附加新对象将无法根据需要高效地完成 你有办法吗 编辑 我的解决方案基于@t-j-crowder方法: var dgram = require("dgram"); var fs = require("fs"); var udp_server = dgram
var dgram = require("dgram");
var fs = require("fs");
var udp_server = dgram.createSocket("udp4");
var udp_server_port = 5000
udp_server.on("message", function (msg, rinfo) {
var json_part = "{\"message\": " + msg + "}";
fs.open('./data/stats.json','r+',function(err,fd){
if(err) throw err
fs.fstat(fd,function(err,stats){
if(err) throw err
if(stats.size>2){
json_part = new Buffer(','+json_part+']','utf-8');
var pos = parseInt(stats.size)-1;
}else{
json_part = new Buffer('['+json_part+']','utf-8');
var pos = 0;
}
fs.write(fd,json_part, 0, json_part.length, pos, function(err,written,buffer){
if(err) throw err
fs.close(fd,function(){
});
});
});
});
});
udp_server.bind(udp_server_port);
您好,马库斯基本上,您需要:
]
查看NodeJS文档,看起来步骤2-4(可以说是步骤5)是一起完成的,使用的
position
参数是。(请确保使用r+
,而不是“附加”模式打开文件。)基本上,您需要:
]
查看NodeJS文档,看起来步骤2-4(可以说是步骤5)是一起完成的,使用的
position
参数是。(请确保使用r+
,而不是“附加”模式打开文件。)基本上,您需要:
]
查看NodeJS文档,看起来步骤2-4(可以说是步骤5)是一起完成的,使用的
position
参数是。(请确保使用r+
,而不是“附加”模式打开文件。)基本上,您需要:
]
查看NodeJS文档,看起来步骤2-4(可以说是步骤5)是一起完成的,使用的
position
参数是。(请确保您使用r+
,而不是“附加”模式打开文件。)看起来简单而好:谢谢!Nodejs自己负责对单个文件(被阻止)的并发写访问,还是我必须管理这种情况?@arbyter:Nodejs不能保证对该文件的原子访问(因为其他进程可以尝试写入),据我所知,默认情况下,不会尝试。我还没有使用nodeapi完成这项工作,但是通常,当您使用适当的标志打开文件时,您可以要求文件系统拒绝对文件的写访问(甚至读访问)。您可能需要研究如何使用Node的API实现这一点(我没有立即看到我在fs.open
docs中想到的选项。)@arbyter:我的建议是使用数据库而不是文件系统上的平面文件。然后,您可以在有消息时将消息插入数据库。MongoDb非常适合存储json对象。通过这种方式,您可以搜索、排序、获取消息的范围,等等。@ben:一个标准是系统占用空间最小,因此数据库是不可能的。看起来简单而好:谢谢!Nodejs自己负责对单个文件(被阻止)的并发写访问,还是我必须管理这种情况?@arbyter:Nodejs不能保证对该文件的原子访问(因为其他进程可以尝试写入),据我所知,默认情况下,不会尝试。我还没有使用nodeapi完成这项工作,但是通常,当您使用适当的标志打开文件时,您可以要求文件系统拒绝对文件的写访问(甚至读访问)。您可能需要研究如何使用Node的API实现这一点(我没有立即看到我在fs.open
docs中想到的选项。)@arbyter:我的建议是使用数据库而不是文件系统上的平面文件。然后,您可以在有消息时将消息插入数据库。MongoDb非常适合存储json对象。通过这种方式,您可以搜索、排序、获取消息的范围,等等。@ben:一个标准是系统占用空间最小,因此数据库是不可能的。看起来简单而好:谢谢!Nodejs自己负责对单个文件(被阻止)的并发写访问,还是我必须管理这种情况?@arbyter:Nodejs不能保证对该文件的原子访问(因为其他进程可以尝试写入),据我所知,默认情况下,不会尝试。我还没有使用nodeapi完成这项工作,但是通常,当您使用适当的标志打开文件时,您可以要求文件系统拒绝对文件的写访问(甚至读访问)。您可能需要研究如何使用Node的API实现这一点(我没有立即看到我在fs.open
docs中想到的选项。)@arbyter:我的建议是使用数据库而不是文件系统上的平面文件。然后,您可以在有消息时将消息插入数据库。MongoDb非常适合存储json对象。通过这种方式,您可以搜索、排序、获取