我需要能够搜索集合大约 200 万个 C# 项目。搜索应该可以在多个字段上进行。简单的字符串匹配就足够了。
使用外部依赖项,例如数据库不是一个选择,但是使用内存数据库就可以了。
主要目标是做到这一点内存效率高.
集合中的类型非常简单,没有长字符串:
public class Item
{
public string Name { get; set; } // Around 50 chars
public string Category { get; set; } // Around 20 chars
public bool IsActive { get; set; }
public DateTimeOffset CreatedAt { get; set; }
public IReadOnlyList<string> Tags { get; set; } // 2-3 items
}
重点及要求
明确重点和要求:
- 没有外部依赖项(如数据库)
- 内存效率高(200 万个项目的内存低于 2 GB)
- 集合中可搜索的项目(必须是高性能的)
今天的非最优解
使用一个简单的List<T>
超过上述类型,或者作为class
or a struct
,仍然需要大约2GB内存。
有没有更好的办法?
班级中最重要的内存消耗是只读列表的使用。摆脱它,您将减少大约 60% 的内存占用(使用三个标签进行测试):
public class Item
{
public string Name { get; set; }
public string Category { get; set; }
public bool IsActive { get; set; }
public DateTimeOffset CreatedAt { get; set; }
public string Tags { get; set; } // Semi-colon separated
}
另外,考虑使用DateTime
代替DateTimeOffset
。这将进一步减少约 10% 的内存占用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)