建议使用json数据结构将聊天日志存储在文本文件中

建议使用json数据结构将聊天日志存储在文本文件中,json,cordova,data-structures,Json,Cordova,Data Structures,我有一个聊天应用程序,我需要存储个人联系人的聊天日志。目前我正在使用下面这样的普通数组来存储在.txt文件中 var messages = [{_id:1, message : "Hello"}, {_id:$1, message : "Hello", }]; 如果它变大了,我可以看到下面的问题 从txt格式返回数组时,需要进行大量的处理 占用了太多的缓存内存 但是,我觉得它简化了信息搜索。我想知道是否有更好的替代结构 注意:与indexedDB或webSQL相比,我更喜欢.txt文件的原因是

我有一个聊天应用程序,我需要存储个人联系人的聊天日志。目前我正在使用下面这样的普通数组来存储在.txt文件中

var messages = [{_id:1, message : "Hello"}, {_id:$1, message : "Hello", }];
如果它变大了,我可以看到下面的问题

  • 从txt格式返回数组时,需要进行大量的处理

  • 占用了太多的缓存内存

  • 但是,我觉得它简化了信息搜索。我想知道是否有更好的替代结构


    注意:与indexedDB或webSQL相比,我更喜欢.txt文件的原因是我不想处理存储限制。

    您可以删除单词
    \u id
    消息
    ,并存储普通
    数组
    [id,message]
    而不是
    对象,这样可以减小文件大小。您可以在搜索时按块从结尾读取文件。您可以将搜索索引存储在单独的文件中

    更新:

    因此,您的文件将是:

    [[1,'message1'],[2,'message2'],[1,'message3']]
    
    它将比使用键时短得多,如果您有静态模式-解析它没有问题:

    var file = JSON.parse(fs.readFileSync('filepath.txt'));
    for (var i = 0; i < file.length; i++) {
        messages.push({id: file[i][0], message: file[i][1]};
    }
    
    var file=JSON.parse(fs.readFileSync('filepath.txt');
    对于(var i=0;i
    经过一点思考,我想最好是按日期将文件分开,然后逐个搜索,搜索时可以通过套接字流式输出,这样用户就可以立即得到输出


    如果你不太关心RAM,你甚至可以将文件缓存在变量中,以防止经常从HDD读取文件,并将TTL设置为缓存过期,以便在一段时间内清除未使用的文件。这样你就不会占用那么多内存。

    我从一些讨论中得出结论,你的“json文本文件”将使用文件API存储,所以这里对文件大小有一个明确的限制,与某些服务器不同,在这些服务器上,您可以假定存储空间几乎是“无限的”。因此,您最终必须限制邮件和联系人的数量

    由于这是一个“聊天日志”,我假设您需要保留消息和用户的顺序,以便能够显示聊天历史记录(如果您只想存储来自各个用户的所有消息,那么答案将完全不同。)

    因此,您必须以固定顺序存储
    {userid:XXX,message:“YYY”}

    正如monkeyinsight所建议的,使用JSON将是最小的数组:
    [XXX,“YYY”]

    为了回答您的问题:1.处理量和2.存储空间,可以将这些消息块与索引一起存储在单独的文件中

    var message_index["msg001.json","msg002.json", ... ];
    
    其中每个文件包含1000条消息,例如

    var messages=[[userid,message], ...];
    
    允许您在存储空间不足或其他情况下从message_索引中删除最旧的文件

    如果不将实际文件另存为JSON,只需使用字符串,例如

    var messages=":1:message one:2:message two:3:another message:4:last message";
    
    var getMsg= function( id, msgs ){
        var key= ":"+id+":";
        var ikey= msgs.search(key);
        var message={'id':id, 'message':""};
        if( ikey >= 0 ){
            var start= ikey+key.length;
            var end= msgs.indexOf(":", start );
            if( end > start ){
                message.message= msgs.substr(start, end-start); 
            }else{ 
                message.message= msgs.substr(start); 
            }
        }
        return message;
    }
    
    var m= getMsg(4, messages);   // returns: {id: 4, message: "last message"}
    
    每个条目保存4个字符(例如“:1:a“vs”[1,'a'],”)


    当然,您必须确保消息中没有出现分隔符(“:”)。

    如何读取和写入此文本文件在客户端?@Pointy我在Cordova应用程序中使用这个。使用文件API我可以做到这一点。谢谢你的回复。好的,这很有帮助-我添加了标签。@Pointy谢谢。你能建议一些方法吗。改为使用数据库。但是当Gzip时它不会有太大变化。你能添加一个例子吗?@monkeyinsight感谢exa例如。但问题是,如果我根据日期进行编辑,有时我可能会从文件中删除一条消息。在这种情况下,它将变为空(?)@redV no,您可以在内存中写入最近的消息,并让用户编辑它们3分钟(如在Skype中)在此之后,消息将变得不可编辑,您将其写入file@monkeyinsight在skype中,也可以在3分钟后删除消息。