【问题标题】:Finding how much memory I can allocate for an array in C#查找我可以为 C# 中的数组分配多少内存
【发布时间】:2009-10-28 21:46:32
【问题描述】:

我正在做一些需要初始化一个大数组的计算。数组的最大大小决定了我能解决的问题的最大大小。

有没有办法以编程方式确定有多少内存可用,比如可能的最大字节数组?

谢谢

【问题讨论】:

    标签: c# memory


    【解决方案1】:

    好吧,依赖一个巨大的数组有一系列相关的问题——内存碎片、连续块、最大对象大小的限制等。如果你需要大量数据,我建议创建一个模拟的类使用许多较小(但仍然很大)数组的大数组,每个数组的大小都是固定的 - 即索引器除以找到合适的数组,然后使用 % 获取该数组内的偏移量。

    您可能还想确保您使用的是具有大量内存的 64 位操作系统。这将为您提供最大的可用空间。

    根据场景的不同,稀疏数组、eta 向量等更复杂的算法可能有助于最大限度地发挥您的能力。您可能会惊讶于几年前人们在内存有限的情况下可以做的事情,而只是一个前后旋转的磁带......

    【讨论】:

    • 在应用程序的整个生命周期中保存一个巨大的数组不会有你提到的任何问题。如果您打算填充 entre 数组,那么稀疏数组没有任何意义。
    • 它将绝对遭受最大 .NET 对象大小和数组大小问题。而且它仍然很容易受到最大连续空间块的影响。
    【解决方案2】:

    为了确保您有足够的可用内存,您可以使用MemoryFailPoint。如果无法分配内存,则会生成InsufficientMemoryException,您可以通过适当的方式捕获并处理。

    【讨论】:

      【解决方案3】:

      简短的回答是“不”。有两个顶级资源需要查询

      1. 进程可用的最大未分配虚拟地址空间块
      2. 可用页面文件空间量。

      正如 Marc Gravell 所说,您将在 64 位平台上取得最大成功。在这里,每个进程都有一个巨大的虚拟地址空间。这将有效地解决您的第一个问题。您还应该确保页面文件很大。

      但是,有一种更好的方法,它只受磁盘上的可用空间限制:内存映射文件。您可以将大型映射(例如 512MB)创建到任意大的文件中,并在处理数据时移动它。请注意,请务必打开它以进行独占访问。

      【讨论】:

        【解决方案4】:

        如果您需要非常非常大的数组,请不要使用 CLR。 Mono 支持 64 位数组索引,让您可以充分利用内存资源。

        【讨论】:

          【解决方案5】:

          我想二进制搜索可能是一种方法。首先,首先分配 1 个字节,如果成功,则释放该字节(将对象设置为 null)并将其加倍为 2 个字节。继续下去,直到你不能再分配,并且你找到了一个你可以考虑为“下限”的限制。

          可以分配的正确字节数(我们称之为x)在区间lower x 低。继续使用二分搜索搜索此区间。

          【讨论】:

            【解决方案6】:

            The biggest array one can allocate in a 64 bit .NET program is 2GB.(Another reference.)

            你可以很容易地找出有多少可用字节:

            
            Using pc As New System.Diagnostics.PerformanceCounter("Memory", "Available Bytes")
              FreeBytes = pc.NextValue();
            End Using
            

            鉴于这些信息,您应该能够做出决定。

            【讨论】:

              猜你喜欢
              • 2014-03-02
              • 2020-03-12
              • 2011-07-27
              • 2012-07-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-07-24
              • 1970-01-01
              相关资源
              最近更新 更多