C#中的大数组引发了OutOfMemoryException异常

8

我在C#编程练习中尝试创建一个长整型数组,长度为0x1fffffff(十进制下为536,870,911),但是出现了System.OutOfMemoryException异常。

我的构建目标是x64系统,在Windows7 x64上运行VisualStudio2008,并拥有8GB的RAM。这应该足够支持这个数组(在JDK x64和CPP项目中可以正常工作)。

有什么想法?

        const long MAX = 0x1fffffff; // 536870911 in base10
        program.arr = new long[MAX];
        for (long i = 0; i < MAX; i++)
        {
            program.arr[i] = i;                
        }

FYI,它被称为“C#”,而不是“CSharp”。 - John Saunders
5
你无法制造那么大的物体。但是即使你可以,你似乎也误解了RAM决定您可以分配多少内存的想法。实际上,RAM并没有决定内存分配量已经有几十年了。RAM的数量限制了您访问内存的速度。拥有更大的RAM是性能优化;内存分配实际上最好被认为是从页面文件中分配。请记住,当您分配内存时,您分配的是虚拟内存,而不是硬件内存 - Eric Lippert
3个回答

29

CLR不支持超过约2GB大小的单个对象。你正在请求一个4,294,967,288字节的数组 - 超过所支持的两倍。

你可以使用那么多内存,但不能在一个单独的对象(比如一个数组)中使用。


5

由于您没有说明您想要实现什么,而只是说出了您不能做什么,因此很难推荐任何有意义的替代方法。

尽管如此,如果您确实需要一些快速连续的查看大于2GB大小的扁平地址空间的东西,您可以使用MemoryMappedFile

如果您指明了将要放入此内存块中的内容、为什么地址空间本身必须是连续的(例如,您是否将指向它的指针传递给非托管代码)以及为什么需要扁平 addressing,那将会更有帮助。


0

创建一个数组子集,然后填充该数组

yourary[]

masterarray[] <------ 将yourary[]填充到2GB的缓冲区,然后将其添加到masterarray中


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接