找到我可以在C#中为数组分配多少内存

时间:2008-12-06 22:45:51

标签: c# memory

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

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

谢谢

6 个答案:

答案 0 :(得分:10)

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

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

根据场景,可以使用更复杂的算法(如稀疏数组,eta向量等)来最大化您可以执行的操作。你可能会惊讶于几年前人们可以用有限的记忆做什么,而且只是一个前后旋转的磁带......

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

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