【发布时间】:2014-09-17 21:03:34
【问题描述】:
我有一张有 50 万行的表格。我需要更新每一行,但 ToList() 失败:
List<Contacts> allContacts = objDatabase.Contacts.ToList();
我每次都会收到 System.OutOfMemoryException。有没有办法解决这个问题?
我已经有了 App.Config 解决方法,但还是不行:
<gcAllowVeryLargeObjects enabled="true" />
我在一台 64 位机器上,有 8GB 内存
【问题讨论】:
-
为什么你需要一次所有的 500,000 条记录?尝试将它们分成块,处理它们并获得另一个块。
-
您是否尝试过使用
foreach循环逐一枚举项目,以便从数据库中逐一进行流式传输?无论哪种方式,在使用 ORM 时,一次处理 500,00 个项目是相当多的。 -
即使您在 64 位计算机上,您也可能在 32 位进程中运行。一些项目模板的默认平台目标是 x86,或者启用了“首选 32 位”选项。如果您正在在 62 位进程中运行,则物理内存不足不会导致内存不足异常;内存被分页到磁盘,这通常会导致糟糕的性能。
-
按照@brz 的建议,分块获取列表。使用 Skip() 和 Take(),每次卡盘后,确保处理并创建一个新的实体容器,这样你的内存就不会被用完。