2011-04-26 74 views
7

对于我在C#中的编程练习,我试图创建长度为 的数组,长度为0x1fffffff(base10中的536,870,911),但是我得到了System.OutOfMEmoryException。大阵列C#OutOfMemoryException

对于构建,我定位了x64系统,并且我在Windows7 x64上运行了带有8GB内存的VisualStudio2008。 它应该是足够的内存阵列(它在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;     
     } 
+0

仅供参考,它被称为“C#”,而不是“CSharp”。 – 2011-04-26 14:34:39

+5

你不能制作一个很大的物体。但即使你能做到,你似乎也会因为RAM决定你可以分配多少内存的错误理解而受苦。它没有,也没有几十年。内存容量限制了*快*你将能够访问该内存。拥有大内存是性能优化;内存分配实际上最好是从页面文件中分配出来的。记住,当你分配内存时,你正在分配*虚拟内存*,而不是*硬件内存*。 – 2011-04-26 15:42:48

回答

25

CLR不支持任何大小大于2GB的单个对象。你要求一个4,294,967,288字节的数组 - 超过两倍的支持。

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

5

很难推荐任何有意义的替代品,因为你没有说明你想要达到什么,只是你不能做什么。

这就是说,如果你确实需要一些快速连续的视图到一个大于2GB的平面地址空间,你可以使用MemoryMappedFile

,如果你表示什么意味着在这个疙瘩的内存,所以地址空间本身必须是想这将有助于连续的(你传递一个指针,它例如非托管代码),为什么它需要平面寻址。

0

并使阵列的一个子集,然后填充该阵列

yourary []

masterarray [] < ------填充youraray []高达缓冲器的2GB然后将其添加在masterarray