首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#:内存不足异常

C#:内存不足异常
EN

Stack Overflow用户
提问于 2011-12-19 23:59:38
回答 6查看 226.3K关注 0票数 73

今天,我的应用程序抛出了一个OutOfMemoryException。对我来说,这几乎是不可能的,因为我有4 4GB的RAM和大量的虚拟内存。当我试图将现有的集合添加到新的列表中时,出现了错误。

List<Vehicle> vList = new List<Vehicle>(selectedVehicles);  

据我所知,这里分配的内存不多,因为我的新列表中应该包含的车辆已经存在于内存中。我不得不承认Vehicle是一个非常复杂的类,我试图一次向新列表中添加大约50.000个条目。但是由于应用程序中的所有Vehicle都来自一个只有200MB大小的数据库,所以我不知道是什么原因导致了OutOfMemoryException

EN

回答 6

Stack Overflow用户

发布于 2014-03-23 23:27:39

3年前的话题,但我找到了另一个可行的解决方案。如果您确定您有足够的空闲内存,运行64位操作系统,但仍然收到异常,请转到Project properties -> Build选项卡,并确保将x64设置为Platform target

票数 95
EN

Stack Overflow用户

发布于 2011-12-20 00:04:47

在应用程序中,存储在数据库中的数据与存储在内存中的数据非常不同。

没有办法获得对象的确切大小,但您可以这样做:

GC.GetTotalMemory() 

在加载了一定数量的对象后,查看加载列表时内存的变化情况。

如果是列表导致了过多的内存使用,那么我们可以寻找最小化它的方法。例如,为什么一开始就希望将50,000个对象一次性加载到内存中。根据需要调用数据库不是最好吗?

如果您看一下这里:http://www.dotnetperls.com/array-memory,您还会看到.NET中的对象大于它们的实际数据。泛型列表甚至比数组更占用内存。如果你的对象中有一个泛型列表,那么它会增长得更快。

票数 14
EN

Stack Overflow用户

发布于 2013-03-18 22:37:57

您不应该尝试一次获取所有列表,因为数据库中元素的大小与它放入内存的元素大小不同。如果你想处理元素,你应该使用for each循环,并利用实体框架的延迟加载,这样你就不会一次把所有的元素都放到内存中。如果想要显示列表,可以使用分页(.Skip()和.take() )

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8563933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档