【问题标题】:The limitation on the size of .Net array.Net 数组大小的限制
【发布时间】:2010-03-10 08:34:06
【问题描述】:

听说.Net Array 的大小有硬性限制。据说可以分配给Array对象的任何单个实例(无论是int[]double[]还是您自己的数组)的最大内存量为2GB。不,如果你有一台 64 位机器,2GB 的限制仍然存在。

我不确定我的印象是否正确。任何人都可以确认?

【问题讨论】:

  • 哇,你开始了一场有趣的讨论。
  • 如果它让您感觉更好:非托管代码也存在 2GB 限制。这是 x64 指令集中的一个约束,索引偏移寻址仍然对偏移有 32 位的限制。不是不能克服,只是这样做效率很低。
  • Hans Passant:我在我的 x64 应用程序中使用 C++ 非托管代码使用 malloc 分配 600E6 双精度数组。那是 4.8E9 字节。

标签: c# arrays


【解决方案1】:

在 4.5 之前的 .NET 版本中,最大对象大小为 2GB。从 4.5 开始,如果启用了 gcAllowVeryLargeObjects,您可以分配更大的对象。请注意,string 的限制不受影响,但“数组”也应涵盖“列表”,因为列表由数组支持。

【讨论】:

  • 感谢@Mark Gravell。我们记得这是一个东西,但忘记了它叫什么。
【解决方案2】:

没错。 No single object can be larger than 2 GB

与 32 位 Windows 操作系统一样 系统,有 2GB 的限制 您可以创建的对象的大小,而 运行 64 位托管应用程序 在 64 位 Windows 操作系统上。

这个问题有更多细节和一些有用的链接:Single objects still limited to 2 GB in size in CLR 4.0?

【讨论】:

【解决方案3】:

首先你会遇到一个实际的限制——分配一个 2gb 的数组几乎是不可能的。我遇到的实际限制是在程序开始时大约 800mb 标记 - 之后急剧下降。

任何大于 64mb 的东西都是 32 位的运气赌博 - 大对象堆没有进行碎片整理,因此您需要一块 65mb 空闲空间,否则分配失败。

理论限制是:

  • 可用内存,尤其是在 32 位下。
  • 32 位数字空间用于索引(0 向上 - 数组没有负数,除非您在创建中玩得很聪明)。您可以创建允许负数的数组,但不能使用 C# 标准语法 - 只能使用反射。
  • 每个对象 2GB。

但说真的,实际影响更大。

对于 .NET 4.0.... 考虑使用内存映射文件 ;)

【讨论】:

    【解决方案4】:

    我原以为限制可能在索引上。我认为使用的索引必须是一个整数,所以任何大于整数的东西都不起作用,除非他们有办法解决这个问题。所以这将是 4294967296 个元素。不确定这是否正确。我想自己知道答案。

    编辑: 正如tomtom 所指出的,整数通常是有符号的,除非它们使用无符号整数。所以大约是 4294967296 或 2147483648 的一半。

    【讨论】:

    • 这几乎是双重的。由于数组是整数索引的......并且从 0 开始 - 只有索引的正数部分可用,大约是你的数字的一半;)所以,你的答案是双重的;)
    • 如果索引是无符号整数,它将是您的号码。
    • @TomTom:不,不是。每个数组都是一个对象,由于对象被限制为 2 GB,它取决于数组所包含的元素类型。
    • @uriDium:2 GB 的限制将大大限制这个数字。数组中不能有 2147483648 个元素。
    • @Brian Rasmussen: 2147483648 是理论上的最大元素数,如果每个元素的长度为 1 字节。
    【解决方案5】:

    希望得到帮助:http://blogs.msdn.com/joshwil/archive/2005/08/10/450202.aspx

    1. 它使用 int 作为索引,其最大值 = 2,147,483,647 (2GB)
    2. 这是设计使然。 2.

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 2023-04-02
      • 1970-01-01
      • 2012-05-13
      • 2011-10-24
      • 1970-01-01
      • 2010-09-05
      • 1970-01-01
      • 2010-10-06
      相关资源
      最近更新 更多