我有一个聊天应用,我需要存储个人联系人的聊天记录。目前我使用如下的普通数组存储在.txt文件中
var messages = [{_id:1, message : "Hello"}, {_id:$1, message : "Hello", }];
如果它变大,我可以看到下面的问题。
在检索时,需要进行大量处理才能将其从txt格式转换回数组。
占用大量内存。
但是,我认为它简化了搜索邮件。想知道是否有更好的替代方案。
注意:首选.txt文件而不是indexedDB或webSQL的原因是我不想处理存储限制。
答案 0 :(得分:6)
您可以移除字词_id
和message
并存储普通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;