【问题标题】:OutOfMemoryException: When trying to iterate through a DataSetOutOfMemoryException:尝试遍历数据集时
【发布时间】: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


【解决方案1】:

您的代码基本上是创建 4,000 个包含 15,000 个双打的列表。如果您有完美的字节打包,那将用完 458 MB 的内存。

我可以毫无问题地在 32 位应用程序中单独运行此代码,但如果我尝试创建 15,000 个双精度数的 14,800 个列表,我会耗尽内存。

我怀疑你的程序的其余部分和你的数据集,听起来你也有逗号分隔的字符串中的数字,那么你很容易耗尽内存。

【讨论】:

  • 8*4*15=480MB(不是吗?)。所以,基本上......我误解了我的极限。不是说单个列表对象可以是2gigs,而是程序的整个内存分配不能超过2gigs。正确的? ...如果是这样...现在我明白了。
  • @MIJ1974 - 4000*15000*8/1024/1024 = 457.763671875。是的,对于 32 位环境中的进程,总共需要 2 GB。
  • 这是我遗漏的最后一块。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
  • 2012-06-05
  • 2015-11-21
  • 2018-01-25
  • 1970-01-01
相关资源
最近更新 更多