c# - 您可以使用 List<List<struct>> 绕过 2gb 对象限制吗?

标签 c# memory memory-management reference 64-bit

我在 c# 中遇到了 2gb 对象限制(由于某些烦人的原因,这甚至适用于 64 位),并且有大量结构(预计总大小为 4.2 gig)。

现在显然使用 List 会给我一个大小为 4.2gb 的列表,但会使用由较小列表组成的列表,这些列表又包含一部分结构,允许我跳过这个限制吗?

我的理由是,它只是 CLR 中的一个硬编码限制,它阻止我在我的 64 位平台上实例化一个 9gig 对象,它与系统资源完全无关。列表和数组也是引用类型,因此包含列表的列表实际上只包含对每个列表的引用。因此没有一个对象超过大小限制。

这有什么不可行的原因吗?我现在会亲自尝试,但我手头没有内存分析器来验证。

最佳答案

Now obviously using List is going to give me a list of size 4.2gb give or take, but would using a list made up of smaller lists, which in turn contain a portion of the structs, allow me to jump this limit?

是的——不过,如果你想解决这个限制,我会考虑自己使用数组,而不是让 List<T>类管理数组。

CLR 中的 2gb 单个对象限制正是如此,单个对象实例。当您创建一个结构数组(List<T> 在内部使用)时,整个数组是 CLR 中的“一个对象实例”。但是,通过使用 List<List<T>>或锯齿状数组,每个内部列表/数组都是一个单独的对象,它允许您有效地拥有您想要的任何大小的对象。

CLR 团队实际上在博客上对此进行了讨论,并提供了 sample BigArray<T> 类似于单个 List<T> 的实现,但在内部为您进行“阻止”管理。这是获取 >2gb 列表的另一种选择。

请注意,.NET 4.5 可以选择提供 larger than 2gb objects on x64 ,但您必须明确选择加入。

关于c# - 您可以使用 List<List<struct>> 绕过 2gb 对象限制吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9892820/

相关文章:

c# - 将字符串从 MSSQL 转换为 MySQL

c# - Visual Studio 2015 智能测试 : The selected type is not visible and cannot be explored

GC 报告可用内存时 Android OutOfMemory?

c++ - 如何在 C++ 中释放已分配的内存?

c - 在C语言中,如何更改指针指向的内存地址?

c++ - 如何更改已映射和已提交内存空间的权限?

c# - 如何在字典中查找值> 0且键与特定字符串模式匹配的键值对?

c# - 从 linq select 查询中读取结果

c - 必须将 ELF 文件的哪一部分加载到内存中?

scala - Spark 缓存 : RDD Only 8% cached