首页 > 解决方案 > 优化长集合(在 LiteDB 中)

问题描述

我有一个存储在 LiteCollection 中的类:

public class Message {
    public string Id => $"{ChannelId}-{MessageId}";
    public long ChannelId { get; set; }
    public long MessageId { get; set; }
    public string Text { get; set; }
    ...
}

MessageID可以重复,ChannelID是唯一的。

为了测试,我向集合中添加了 700k 条随机消息。但我认为实际上还会有更多。

现在通过标识符接收特定消息需要 70 毫秒,而从 MessageID 和 ChannelID 总共需要 140 毫秒。

鉴于元素的数量会增加,我该如何优化呢?

它不仅可以将所有内容都放入一个集合中,而且例如:

标签: c#nosqllitedb

解决方案


如果您只需要一个组合字典键,那么这将做:

var allMessages = new List<Message>()
{
    // channelId, messageId, text
    new Message(1, 1, "Message1"),
    new Message(1, 2, "Message2"),
    new Message(2, 1, "Message3")
};

var lookup = allMessages.ToDictionary(x => x.Id, x => x);

// to find an entry by (channelId, messageId)
var id = $"{1}-{2}"; // keep in sync with your Message.Id()
var myItem = lookup[id];

// make sure to remove / add an entry from the dict before / after you change it

推荐阅读