存储许多小对象的高效内存方式

本文关键字:内存 方式 高效 许多小 对象 存储 | 更新日期: 2023-09-27 18:20:56

我有一个简单的Person类,它有4个字符串和整数。

public class Person
{
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }
        public string PostalCode { get; set; }
}

我们需要在内存中存储大量这样的内容。该集合需要可通过任何字段进行搜索。项目将作为生命周期的一部分进行添加和删除。

Flyweight模式似乎不起作用,因为在对象上没有太多重复的值,只有在字段级别。哪种模式或策略最适合限制内存开销并表现良好?

存储许多小对象的高效内存方式

我们需要在内存中存储大量这样的内容。

那么,数组Person[]将是最精简的方式,但List<Person>将非常接近并且更容易使用。只需确保使用Capacity参数来最大限度地减少重新分配。

该集合需要通过任何字段进行搜索

简单,.Where (p => p.FirstName == value)
用Dictionaries加速它会消耗内存。

这里可能有多种组合。。。首先,它最好保留为引用类型,这样在搜索时就不会到处复制结构。使用string.Intern(string)可以减少重复的名字和姓氏以及邮政编码的内存使用。。。最后使用Dictionary<TKey, TValue>按值对这些条目进行索引。。。在FirstName的情况下,TKey可能是字符串,而TValue'是List<Person>,因此您可以通过所述字符串查找人员。。。这被称为反向索引:http://en.wikipedia.org/wiki/Inverted_index-Dictionary的另一种选择是实现自己的Tree或Trie结构,例如Prefix Trie。。。你用O(logn)速度换取比O(1)字典更少的内存。

就将它们存储在内存中而言,这取决于很多是什么……但最终你希望有足够的内存来处理所有这些。。。或者开始扩展到分布式系统以共享对象,例如MapReduce模式或磁盘上的"分页"。