【发布时间】:2009-10-28 21:46:32
【问题描述】:
我正在做一些需要初始化一个大数组的计算。数组的最大大小决定了我能解决的问题的最大大小。
有没有办法以编程方式确定有多少内存可用,比如可能的最大字节数组?
谢谢
【问题讨论】:
我正在做一些需要初始化一个大数组的计算。数组的最大大小决定了我能解决的问题的最大大小。
有没有办法以编程方式确定有多少内存可用,比如可能的最大字节数组?
谢谢
【问题讨论】:
好吧,依赖一个巨大的数组有一系列相关的问题——内存碎片、连续块、最大对象大小的限制等。如果你需要大量数据,我建议创建一个模拟的类使用许多较小(但仍然很大)数组的大数组,每个数组的大小都是固定的 - 即索引器除以找到合适的数组,然后使用 % 获取该数组内的偏移量。
您可能还想确保您使用的是具有大量内存的 64 位操作系统。这将为您提供最大的可用空间。
根据场景的不同,稀疏数组、eta 向量等更复杂的算法可能有助于最大限度地发挥您的能力。您可能会惊讶于几年前人们在内存有限的情况下可以做的事情,而只是一个前后旋转的磁带......
【讨论】:
为了确保您有足够的可用内存,您可以使用MemoryFailPoint。如果无法分配内存,则会生成InsufficientMemoryException,您可以通过适当的方式捕获并处理。
【讨论】:
简短的回答是“不”。有两个顶级资源需要查询
正如 Marc Gravell 所说,您将在 64 位平台上取得最大成功。在这里,每个进程都有一个巨大的虚拟地址空间。这将有效地解决您的第一个问题。您还应该确保页面文件很大。
但是,有一种更好的方法,它只受磁盘上的可用空间限制:内存映射文件。您可以将大型映射(例如 512MB)创建到任意大的文件中,并在处理数据时移动它。请注意,请务必打开它以进行独占访问。
【讨论】:
如果您需要非常非常大的数组,请不要使用 CLR。 Mono 支持 64 位数组索引,让您可以充分利用内存资源。
【讨论】:
我想二进制搜索可能是一种方法。首先,首先分配 1 个字节,如果成功,则释放该字节(将对象设置为 null)并将其加倍为 2 个字节。继续下去,直到你不能再分配,并且你找到了一个你可以考虑为“下限”的限制。
可以分配的正确字节数(我们称之为x)在区间lower x 低。继续使用二分搜索搜索此区间。
【讨论】:
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
鉴于这些信息,您应该能够做出决定。
【讨论】: