【发布时间】:2015-10-06 04:27:11
【问题描述】:
我遇到了一个我无法解释的情况。我将一个双精度数组转换为逗号分隔的字符串,并将其保存到数据库中以供以后检索。大约有 4k 条记录,每条记录都包含一个字符串,该字符串将创建一个包含大约 14k 个数字的数组。当我试图检索我的双打列表并将它们放入双打列表的集合中时(ea:List>),我得到了 OutOfMemoryException。现在,8bytes*15k*4k = 480megs。这与列表的 OutOfMemory 限制相差无几。
为了排查问题,我做了一个简单的测试循环,实现了两件事:
1:如果我在我的方法中(在 Using 语句中)使用这个 ~500meg 数据集,我会得到 OutOfMemoryException。 (如果我不包含 DataSet,它可以正常工作)
2:如果我从属性/调试部分取消选中“首选 32 位”复选框。即使我使用这个 ~500meg 数据集,该方法也会正确完成
Q1:有人能告诉我为什么当这个 ~500meg 数据集存在时我的方法失败了。
Q2:为什么“Prefer 32bit”解决了我的问题?我还没有机会在 32 位机器上测试它……但我的第一个猜测是它会失败。
注意:我有一台 64 位的机器。
【问题讨论】:
-
.NET 可能无法分配 32 位模式所需的 连续 内存。
-
我不确定这是否是 500mb 的数据。但我认为 32 位应用程序无法访问超过 2Gb 的内存。
-
你让我意识到了一些事情。是不是因为 DataSet 是 ~500megs 而列表是 ~500megs,因此它是 ~1gig.. 并且 Prefer-32bit 选项真的小于 2gig 限制?
-
可以的。由于他们不共享相同的参考意味着它的副本。但是当它们的引用消失时,GC 应该能够清除所有这些列表。顺便说一句,您应该考虑其他应用程序也使用内存。使用。应用程序的 Net memory Profiler 并查看溢出之前需要多少内存。还请注意您总共有多少内存。也许还有其他我不知道的可能性。
标签: c# dataset out-of-memory