我有大量当前定义为obj[]的相同类obj的对象。
在大多数情况下,这些obj只是default(obj),实现IEnumerable<obj>而不是这些obj[]列表不是最好吗?
这应该会为我释放内存,对吧?目前,这些对象(运行内存分析器)有200k个项目(不断增长)。
将列表更改为IEnumerables会对我有帮助吗?
发布于 2011-04-23 10:13:55
List<T>的实际实现是基于数组的,因此两者之间的内存使用差异可以忽略不计。
就IEnumerable<T>而言:不,它不会为您节省任何内存。null或default元素在IEnumerable<T>中是完全可接受的,并且框架不做任何过滤重复项的操作。它不能,因为与IEnumerable<T>结构相关联的内存占用完全依赖于实现它的类,并且如果您只是将一个数组放入一个可枚举的变量或字段中,那么您不会改变任何实质性的东西。Enumerable也是不可变的,因此建议的开关可能是对数组实现的一个破坏性更改。
如果你不关心排序,你可以使用HashSet。这实际上会过滤重复项,所以如果您的许多或大多数元素都是default(T),那么只需要其中一个元素的内存。显然,这将消除所有重复项,而不仅仅是默认的重复项,因此只有在没有其他重复项的情况下,此选项才有用。
如果你需要可变的语义--我怀疑你是在使用数组--那么你可以(也应该)切换到一个可变的接口,比如IList<T>,然后编写你自己的实现--可能基于List<T> --当你尝试添加default(T)时,它会忽略它。这样,您就可以保留非default元素的顺序,而无需分配任何内存来保存default元素。
如果您确实需要保留所有原始元素,那么任何简单的数据结构都不会对您有所帮助。我可以推荐一个数据库吗?我知道现在内存很充裕,但当你存储数十万个项目时,你至少应该考虑一个为这种规模而设计的数据结构或系统。
发布于 2011-04-23 09:43:47
IEnumerable只是一个接口;它没有规定任何存储数据的方法。List只包含一个数组,该数组会随着您向其中添加更多的项而增长,但是您可以调用TrimExcess()方法来缩小该数组。
发布于 2011-04-23 10:14:06
正如马克所说,IEnumerable只是一个接口。Object[]和List (以及.NET框架中的大多数其他泛型集合)实际上实现了IEnumerable接口。
一个更合适的问题应该是Object[]、List或LinkedList等哪个更好。
对象数组(即Object[])将具有最小的内存占用,因为列表可能是数组内存大小的两倍(取决于列表中有多少元素)。当您向列表添加项时,内部数组已满,它会使数组的大小加倍,试图从算法的角度使添加新元素的速度平均更快。
https://stackoverflow.com/questions/5761568
复制相似问题