在不解析JSON对象的情况下附加JSON对象的有效方法

时间:2014-05-21 10:10:42

标签: json node.js optimization

我在一个udp-port上写了一个小脚本,并将所有传入的消息(一个JSON对象)存储在一个文件中。空文件包含JSON格式的数组。 我正在寻找一种有效的方法来存储来自这个单个文件中的多个客户端的所有(并发)传入消息。 文件大小可以是几百兆字节。解析文件并附加新对象根本不会有效。

你有办法吗?

修改 我的解决方案,基于@ t-j-crowder方法:

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

问候,马库斯

1 个答案:

答案 0 :(得分:3)

从根本上说,你需要:

  1. 使用可搜索的可写流打开文件。

  2. 寻求结束。

  3. 备份一个字符(在数组的结尾]之上)。

  4. 写出一个逗号(如果这不是第一个条目)和新条目的JSON。

  5. 写一个结束]

  6. 关闭文件。

  7. 查看NodeJS文档,看起来步骤2-4(可以说是5)使用fs.writeposition参数一起完成。 (确保使用r+打开文件,而不是“附加”模式之一。)