gpt4 book ai didi

c# - .NET 中的数组分配

转载 作者:太空宇宙 更新时间:2023-11-03 18:11:15 24 4
gpt4 key购买 nike

问题是关于 .net 中数组的分配。我在下面有一个示例程序,其中我可以获得的最大数组是长度。我将长度增加到 +1,它给出了 outofMemory 异常。但是如果我保持长度并删除注释,我就可以分配 2 个不同的大数组。两个数组都小于 .net 允许的 2 GB 对象大小,总内存也小于虚拟内存。有人可以提出任何想法吗?

 
class Program
{
static int length = 203423225;
static double[] d = new double[length];
//static int[] i = new int[15000000];
static void Main(string[] args)
{

Console.WriteLine((sizeof(double)*(double)length)/(1024*1024));

Console.WriteLine(d.Length);
//Console.WriteLine(i.Length);
Console.WriteLine(Process.GetCurrentProcess().VirtualMemorySize64.ToString());
}
}

最佳答案

32 位进程必须从其可用的地址空间中为数组分配虚拟内存。默认为 2 GB。其中包含代码和数据的混合。分配是从现有分配之间的漏洞进行的。

这样的分配总是失败不是因为没有更多的虚拟内存,而是因为可用的空洞不够大。而你要求一个大洞,获得 1.6 jiggabytes 是非常罕见的,并且只能在不加载任何额外 DLL 的非常简单的程序上工作。基础不佳的 DLL 是将一个大洞一分为二的好方法,可大大降低此类分配成功的几率。更典型的首次尝试分配大约为 650 兆字节。第二次分配没有失败,因为还有另一个空洞可用。在程序运行一段时间并且地址空间变得碎片化后,几率会大大降低。 90 MB 的分配可能会失败。

您可以深入了解如何使用 SysInternals 的 VMMap 实用程序为程序划分虚拟内存地址空间。

一个简单的解决方法是将 EXE 项目的平台目标设置为 AnyCPU 并在 64 位操作系统上运行该程序。它将有大量可用的可寻址虚拟内存空间,您将仅受页面文件的最大允许大小和 .NET 2 GB 对象大小限制的限制。 .NET 4.5 中使用新的 <gcAllowVeryLargeObjects> 解决的限制配置元素。即使是 32 位程序也可以通过 editbin.exe 的/LARGEADDRESSAWARE 选项利用 64 位操作系统上可用的 4 GB 32 位地址空间,您必须在构建后事件中运行它。

关于c# - .NET 中的数组分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14833279/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com