Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
附加JSON对象而不解析它的有效方法_Json_Node.js_Optimization - Fatal编程技术网

附加JSON对象而不解析它的有效方法

附加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

我编写了一个在udp端口上监听的小脚本,并将所有传入消息(一个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);

您好,马库斯基本上,您需要:

  • 使用可查找、可写的流打开文件

  • 寻找它的尽头

  • 备份一个字符(在数组的结尾处)

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

  • 写一个结束语
    ]

  • 关闭文件


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

    基本上,您需要:

  • 使用可查找、可写的流打开文件

  • 寻找它的尽头

  • 备份一个字符(在数组的结尾处)

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

  • 写一个结束语
    ]

  • 关闭文件


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

    基本上,您需要:

  • 使用可查找、可写的流打开文件

  • 寻找它的尽头

  • 备份一个字符(在数组的结尾处)

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

  • 写一个结束语
    ]

  • 关闭文件


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

    基本上,您需要:

  • 使用可查找、可写的流打开文件

  • 寻找它的尽头

  • 备份一个字符(在数组的结尾处)

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

  • 写一个结束语
    ]

  • 关闭文件


  • 查看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对象。通过这种方式,您可以搜索、排序、获取