我用List <string>命中了OutOfMemoryException - 这是限制还是我遗漏了什么?

Mar*_*ayo 14 c# memory list out-of-memory

如果有机会重写,我会,但无论如何,代码如下:

List<string> foobar;
Run Code Online (Sandbox Code Playgroud)

然后我们将一堆字符串添加到foobar.

在count = 16777216时,我们达到了内存不足的限制.

我的理解是每个字符串的大小不同.确实在查看数据(不是我的数据),大多数是2或3个字符.

c#中数据的最大限制是多少?表示最大限制为:

可以存储在List的当前实现中的最大元素数量理论上是Int32.MaxValue - 仅超过20亿.

然而:

在当前的CLR的Microsoft实现中,最大对象大小限制为2GB.(有可能其他实现,例如Mono,没有这个限制.)

在我的例子中,我有什么,1600万个结果*几个字节?任务管理器显示正在使用的演出,但我有8演出的RAM.

16777216(2 ^ 24)似乎是一个相当具体的价值 - 可疑地像一个限制,但我无法找到任何文件a)支持这个或b)找到解决方法?

任何帮助,将不胜感激.


一些代码:

List<string> returnList = new List<string>();
SqlDataReader dr; //  executes a read on a database, have removed that part as that bit works fine

  if (dr.HasRows)
  {
      while (dr.Read())
      {
          returnList.Add(dr.GetString(0).Trim());
      }
  }
Run Code Online (Sandbox Code Playgroud)

这是简化的形式,我现在有一些尝试/捕获OOM异常,但这是给我悲伤的实际代码.

Ste*_* Py 8

如果您尝试在64位环境中使用非常大的列表,则需要在应用程序配置中启用大型对象.

http://msdn.microsoft.com/en-us/library/hh285054.aspx

OOM可能是由于Lists/ArrayLists分配内存的方式,我相信每次达到它们的边界时,它们都会尝试将内存加倍.该列表不能从2 ^ 24加倍.理论上,您可以通过预先指定大小来最大化列表大小.(即2GB)