C# Collection 的最大容量在哪里定义?

2024-05-03

我尝试向一个Collection添加大量元素,每个元素都是简单的数据传输对象,具有基本数据类型的五个属性,没有什么特别的。

在循环中添加新条目时,我总是收到 OutOfMemoryException。有趣的是,当我尝试添加第 8388608 个元素(即 8*1024*1024)时,我总是遇到异常。因此,我假设此类集合中允许的容量(元素数量)存在内置限制,但我找不到有关它的任何信息。

这个极限真的存在吗?我在哪里可以找到此文档?


这是一个 OutOfMemoryException,因此这里讨论的不是集合的大小或容量:而是应用程序中的内存使用情况。诀窍在于,您不必耗尽机器甚至进程中的内存来获取此异常。

我认为正在发生的事情是你正在填满大型对象堆。随着馆藏的增长,他们需要在后台添加存储空间以容纳新项目。一旦分配了新存储并复制了项目,旧存储就会被释放,并且应该有资格进行垃圾回收。

问题是,一旦超过一定大小(以前是 85000 字节,但现在可能不同),垃圾收集器 (GC) 就会使用称为大对象堆 (LOH) 的东西来跟踪您的内存。当 GC 从 LOH 中释放内存时(这种情况一开始很少发生),内存将返回到操作系统并可供其他进程使用,但虚拟地址空间该内存中的内容仍将在您自己的进程中使用。您的程序地址表中将出现一个巨大的漏洞,并且由于该漏洞位于大对象堆上,因此永远不会被压缩或回收。

您在 2 的精确幂上看到此异常的原因是,大多数 .Net 集合使用加倍算法来向集合添加存储。它总是会在需要再次加倍的点抛出异常,因为在那之前 RAM 已经被分配了。

那么,一个快速的解决方案是利用大多数 .Net 集合中很少使用的功能。如果您查看构造函数重载,您会发现大多数集合类型都具有允许您在初始构造期间设置容量的类型。此容量不是一个硬性限制 - 它只是一个起点 - 但它在某些情况下很有用,包括当您的集合将变得非常大时。您可以将初始容量设置为一些淫秽的东西...希望大小足以容纳您的所有物品,或者至少只需要“加倍”一次或两次。

您可以通过在控制台应用程序中运行以下代码来查看此效果:

var x = new List<int>();
for (long y = 0; y < long.MaxValue; y++)
    x.Add(0);

在我的系统上,在 134217728 项之后抛出 OutOfMemory 异常。 134217728 * 每个 int 4 字节仅(且恰好)512MB RAM。它还不应该抛出,因为这是该过程中唯一具有任何实际大小的东西,但它无论如何都会抛出,因为旧版本的集合丢失了地址空间。

现在让我们更改代码来设置容量,如下所示:

var x = new List<int>(134217728 * 2);
for (long y = 0; y < long.MaxValue; y++)
    x.Add(0);

现在,我的系统在抛出时一直达到 268435456 个项目(1GB RAM),之所以这样做,是因为由于进程使用的其他 RAM 占用了 2GB 虚拟地址表限制的一部分(即,它无法将 1GB 加倍) :循环计数器以及来自集合对象和进程本身的任何开销)。

我无法解释的是,它不允许我使用 3 作为乘数,即使那只是(!)1.5GB。使用不同乘数的一个小实验试图找出我能得到多大的结果,结果表明这个数字并不一致。有一次我能够达到 2.6 以上,但后来不得不回退到 2.4 以下。我想有新的发现。

如果这个解决方案确实为您提供了足够的空间,那么还有一个可以用来获得 3GB 虚拟地址空间的技巧 https://stackoverflow.com/questions/464458/how-do-i-create-a-32-bit-net-application-to-use-3-gb-ram,或者您可以强制您的应用程序针对 x64 而不是 x86 或 AnyCPU 进行编译。如果您使用的是基于 2.0 运行时的框架版本(从 .Net 3.5 开始的任何版本),您可以尝试更新到 .Net 4.0 或更高版本,据报道这会更好一些。如果做不到这些,您将不得不彻底重写如何处理数据,这可能涉及将数据保存在磁盘上,并且一次仅在内存中保存单个项目或项目的小样本(缓存)。我真的推荐最后一个选项,因为其他任何东西最终都可能会意外地再次中断(如果你的数据集一开始就这么大,它也可能会增长)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# Collection 的最大容量在哪里定义? 的相关文章

  • 在 .Net 应用程序中使用 Active Directory Web 服务

    我正在尝试构建一个 Net 应用程序来询问 Active Directory 编辑 我需要使用 Web 服务来执行此操作 因为我将使用需要使用 Web 服务的第三方工作流工具从 Sharepoint 工作流与 AD 进行通信 根据我的研究
  • Wix - 自定义安装目录

    我使用的是 Wix 3 x 用户应该能够选择目标目录 我的Setup wxs目前是这样的 http pastebin com uH1EjbDQ http pastebin com uH1EjbDQ 询问用户自定义目标目录的最简单方法是什么
  • ConcurrentHashMap 内部是如何工作的?

    我正在阅读有关 Java 并发性的 Oracle 官方文档 我想知道Collection由返回 public static
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • string.Compare 行为

    怎么会这样呢 这是从VS2008中的立即窗口获取的 string Compare 1 string Compare 0 0 1 从言论来看字符串比较 http msdn microsoft com en us library 84787k2
  • 哪些属性有助于运行时 .Net 性能?

    我正在寻找可用于通过向加载器 JIT 编译器或 ngen 提供提示来确保 Net 应用程序获得最佳运行时性能的属性 例如我们有可调试属性 http msdn microsoft com en us library k2wxda47 aspx
  • 如何打开 Windows 资源管理器窗口并选择特定文件夹

    我有一个 winform 应用程序 这个 winform 应用程序创建了几个文件 我想在我的应用程序中实现 查找目标 功能来显示这些文件 这些文件位于同一文件夹中 看图片 假设我创建了几个文件 C Test 文件夹 该文件夹包含以下文件 C
  • 是否可以修改 PDF 表单字段名称?

    情况是这样的 我有一个 PDF 其中包含自动生成的 pdf 表单字段名称 问题是这些名称不太用户友好 它们看起来像 topmostSubform 0 Page1 0 Website Address 0 我希望能够更改它们 使它们类似于 We
  • 使用 LINQ 通过一个属性比较两个列表

    假设我有以下内容 class Widget1 public int TypeID get set public string Color get set class Widget2 public int TypeID get set pub
  • 如何在Web网格的列中编写IF条件

    我在 WEB GRID 列中创建 if 条件时遇到错误 所以 请帮助改进我的代码并解决我的问题 grid Column Status format item gt
  • 如何在 sql server 中加密数据并在 .net 应用程序中解密

    我想加密 sql server 中的一些密码并让 c 应用程序解密它们 显然 我可以创建一个 SP 来解密所需的密码并将其传递给 c 应用程序 但这意味着通过网络发送明文密码 因此 我希望能够在 sql server 中加密我的密码 使用密
  • 删除 TableLayoutPanel 中的特定行

    我有 TableLayoutPanel 我以编程方式添加行 用户基本上选择一个属性 然后与一些控件一起显示在表中 我想我在这里有一个一般性的理解问题 我会尽力解释它 每行中的控件之一是 删除 按钮 该按钮应该删除它所在的行 我所做的是将事件
  • 检查 DBNull 会引发 StrongTypingException

    我正在使用数据集从数据库中提取数据 一行中的一个字段是NULL 我知道这个 但是 以下 vb net 代码会抛出StrongTypingException 在数据集设计器中自动生成的 get SomeField 方法中 If Not IsD
  • 为什么抽象类应该实现抽象基类的抽象方法?

    在下面的示例中 该类Derived实现抽象方法method从课堂上Main 但我想不出在抽象中填写方法体的理由Derived类的实现 当然 我应该只在实际类中实现抽象方法 那么我怎样才能避免这样做呢 我还可以做些什么 abstract cl
  • MySQL - 多个结果集

    我正在使用 NET Connector 连接到 MySQL 在我的应用程序中 很少有线程使用相同的连接 因此如果 MySQLDataReader 尚未关闭并且某个线程正在尝试执行查询 则会出现该错误 已经有一个打开的 DataReader
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • 线程睡眠和Windows服务

    我正在开发一个 Windows 服务 该服务存在一些问题Thread Sleep 所以我想我会尝试使用计时器 因为这个问题建议 在 Windows 服务中使用 Thread Sleep https stackoverflow com que
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • 有没有办法禁用 .NET 标签的“双击复制”功能?

    这真的很烦人 我使用标签作为列表项用户控件的一部分 用户可以单击它来选择列表项 然后双击它来重命名它 但是 如果剪贴板中有名称 双击标签会将其替换为标签文本 我还检查了应用程序中的其他标签 双击它们也会将其复制到剪贴板 我没有在这个程序中编

随机推荐

  • 隐式运算符

    我刚刚看到它在最近的答案之一中使用 public static implicit operator bool Savepoint sp return sp null 为什么我们需要言语implicit这里 这是什么意思 隐式意味着转换不需要
  • 如何在ActiveAdmin中过滤IS NULL?

    我有一个带有名为 map id 的整数列的表 我想添加一个 activeadmin 过滤器来过滤此列是否为 NULL 或 IS NOT NULL 这如何实施 我尝试了以下过滤器 filter map id label gt Assigned
  • 避免在 django allauth 的自定义用户模型中创建用户名字段

    我正在使用带有 allauth 的自定义用户模型 并且需要省略用户名字段 我已经看过文档和一大堆关于使用的 stackoverflow 答案ACCOUNT USER MODEL USERNAME FIELD None但所有这些仍然导致我的数
  • null != Something 和 Something != null 之间的区别

    之间有区别吗null something and something null在爪哇 如果有区别 那么我应该使用哪一个 为什么 之间没有区别null something and something null 你一定在想person getN
  • Javassist 增强部署失败

    我遇到了底部堆栈跟踪中指定的错误this https stackoverflow com questions 26220232 hibernate lazy loading proxy gorm static apis instanceof
  • JHipster - 日志文件

    我正在运行一个 JHipster 应用程序 我想知道日志文件在哪里 它们是在哪里生成的 这是一个新手问题 但找不到任何东西 我使用默认配置的 Dev 配置文件 没有更改有关 application dev yml 的任何内容 Thanks
  • 无法使用 XCode 创建快照

    我无法在 XCode 中拍摄我的特定项目的更多快照 如果我尝试创建快照 它会在状态栏中显示 正在创建快照 并永远持续下去 然后我强制退出 Xcode 重新启动并尝试再次创建快照 这次它立即给出错误消息 手动删除文件 锁定 因此 我然后使用终
  • jquery/javascript setInterval

    目前我正在开发一个用户通知提醒消息功能 我设法使用setInterval控制我的 Ajax 调用 检查是否有用户的通知消息 但我的问题是我只想要通知消息 在页面上出现一次 现在它在屏幕上显示多个通知警报消息 我知道你可以使用setTimeo
  • Android Canvas.DrawBitmap 没有模糊/抗锯齿?

    我正在尝试使用精灵 或非常像素化的角色 背景等 制作一个Android游戏 我把它们画在画布上 就像这样 matrix preScale xrat yrat canvas drawBitmap img matrix null 其中 img
  • 如何获取android中listview特定项目的id?

    我在用Listview并设置多个项目 每个项目都有喜欢 分享和评论选项 实际上我已经获取了 Item Id 并且还setText of TextView 成功了 但无法在特定项目的 Like 按钮单击事件上获取项目 ID 如何获取每个项目的
  • Android 中如何调用 getContentResolver() ?

    我想知道当时的背景getContentResolver 叫做 我有一个这样的场景 我有一个调用方法的活动 AmyFunc B 类 这不是一项活动 所以 在B类中我必须使用getContentResolver 我直接打电话getContent
  • 使用指令将类添加到宿主元素[重复]

    这个问题在这里已经有答案了 我目前正在学习 Angular 2 我了解如何使用 AngularRenderer设置一个ElementStyle 但现在我想使用Renderer方法 setElementClass renderElement
  • 获取 Spark 中组的最后一个值

    我有一个 SparkR DataFrame 如下所示 Create R data frame custId lt c rep 1001 5 rep 1002 3 1003 date lt c 2013 08 01 2014 01 01 20
  • Java 中的原始数据类型是线程安全的吗

    原始数据类型是这样的吗int shortJava 线程安全 我执行了以下代码 有时看不到预期结果 500 public class SampleThree extends Thread static long wakeUpTime Syst
  • CSS - 当 Margin-Top 存在时,Margin-Bottom 被忽略

    我有一个场景 我有多个 DIV 与 margin top 和 margin bottom 堆叠在一起 但我发现当我有 margin top 时 margin bottom 被忽略 我无法解释这是如何发生的 html div class bo
  • 为什么 LuaJIT 这么好?

    编辑 不幸的是 LuaJIT 已从下面链接的比较中删除 This 比较 http shootout alioth debian org u64 which programming languages are fastest php编程语言的
  • 使用java进行JSON模式验证[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在为返回 JSON 对象的 java webapp 编写一些验收测试 我想验证返回的 JSON 是否针对架构进行验证 任何人都可以建议
  • 在 npm 中安装 js beautify 时`没有这样的文件或目录`

    当我使用时出现此错误npm g install js beautify npm ERR path home developer software nodejs lib node modules js beautify js bin css
  • Rails 加载完成后运行代码?

    我有一个定期任务需要每分钟执行一次 使用delayed job 我希望 Rails 在加载完成后立即自动将其排队 如果系统中尚不存在此类任务 对于我来说 在整个 Rails 引导流程结束时运行一些代码的好地方是什么 有人建议 config
  • C# Collection 的最大容量在哪里定义?

    我尝试向一个Collection添加大量元素 每个元素都是简单的数据传输对象 具有基本数据类型的五个属性 没有什么特别的 在循环中添加新条目时 我总是收到 OutOfMemoryException 有趣的是 当我尝试添加第 8388608