推荐的json数据结构将聊天记录存储在文本文件中

时间:2014-10-23 23:22:03

标签: json cordova data-structures

我有一个聊天应用,我需要存储个人联系人的聊天记录。目前我使用如下的普通数组存储在.txt文件中

var messages = [{_id:1, message : "Hello"}, {_id:$1, message : "Hello", }];

如果它变大,我可以看到下面的问题。

  1. 在检索时,需要进行大量处理才能将其从txt格式转换回数组。

  2. 占用大量内存。

  3. 但是,我认为它简化了搜索邮件。想知道是否有更好的替代方案。

    注意:首选.txt文件而不是indexedDB或webSQL的原因是我不想处理存储限制。

2 个答案:

答案 0 :(得分:6)

您可以移除字词_idmessage并存储普通array [id, message]而不是object,这样您就可以减少文件大小。您可以在搜索时读取以块结尾的文件。您可以将搜索索引存储在单独的文件中。

<强>更新

所以你的文件将是:

[[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]};
}

经过一番思考,我想最好按日期2014-10-26.txt分隔文件并逐个搜索它们,你可以在搜索时通过socket流输出,这样用户就可以立即输出。

如果你对RAM不太关心,你甚至可以在变量中缓存文件以防止来自HDD的read,并在缓存过期时设置TTL以暂时取消未使用的文件。这样你就不会得到那么多的内存。

答案 1 :(得分:3)

我从一些讨论中收集到你的&#39; json文本文件&#39;将使用File API进行存储,因此对文件大小有一定的限制,而不是某些服务器,你可以假定它几乎是无限的。存储。因此,您最终必须限制消息和联系人的数量。

由于这是一个“聊天记录”,我假设您需要保留消息和用户的顺序才能显示聊天记录(如果您只想存储来自各个用户的所有消息,答案会有很大差异。)

因此,您坚持按固定顺序存储{userid:XXX, message:"YYY"}

正如 monkeyinsight 建议的那样,使用JSON这将是一个最小的数组:[XXX,"YYY"]

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

var message_index["msg001.json","msg002.json", ... ];

其中每个文件包含1000条消息

var messages=[[userid,message], ...];

允许您在存储空间不足时从message_index中删除最旧的文件。

如果您不将它们保存为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个字符(例如&#34;:1:a&#34; vs&#34; [1,&#39; a&#39;],&#34;)

当然,您必须确保消息中没有出现分隔符(在此示例中为&#39;:#39;