c# - 优化长集合(在 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 毫秒。
鉴于元素的数量会增加,我该如何优化呢?
它不仅可以将所有内容都放入一个集合中,而且例如:
- 为通道创建一个新集合以创建一个通道类,并在
- 它存储与此频道相关的所有消息?
解决方案
如果您只需要一个组合字典键,那么这将做:
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
推荐阅读
- javascript - 在 svg 图片的不同部分添加事件监听器
- service - 如何在特定的 Nodeport 上公开 Kubernetes 服务?
- android - 如何将从单个表中的多个 pojo 类中获取的特定值持久保存到 Android 中的 Room 数据库中?
- python - 找不到保存在另一个子目录中的模块
- python - 如何将新列表分配给作为参数传递的列表?
- javascript - 条形图仪表 Highcharts
- python - Tensorflow Keras LSTM 未训练 - 受 number_of_epochs、优化器 adam 的影响
- node.js - 在 Nginx 和 CloudFlare 上运行 Node.js 的两个网站的重定向问题
- batch-file - 如何根据用户输入的文件扩展名将某些文件移动到另一个文件夹并为每个移动的文件在原始目录中创建快捷方式?
- arrays - 谷歌表格数组范围