我的应用程序包含非常大的DataTable对象,非常大的数组等。
目前我的内存使用率低于2GB。
当我的应用程序在32位系统上生成4个1GB大小的阵列时会发生什么?
它会崩溃吗?
我知道CLR中的2GB对象大小限制,但是许多大对象呢?
我试图测试它,我声明了几个大数组,但是当它们是空的时,他们似乎没有使用RAM。我没试过填写它们,我决定在这里问。
答案 0 :(得分:6)
64位应用程序(包括托管应用程序)可以访问大容量内存。
32位应用程序的虚拟地址空间最大为4GB。实际上,它们默认为2GB。 /LARGEADRESSAWARE
应用程序可以在boot.ini中获得3GB / 3gb或在WoW64上运行时获得4GB。
托管应用程序,即使在x64上也不能,分配任何大于2GB的单个对象。这包括数组。
但无论您可以使用的VA数量多少:操纵+ 2GB DataTable对象都无法正常工作。使用能够快速处理和操作大量数据并能够智能分页的存储引擎。 Redis,Cassandra甚至传统的RDBMS更适合这项工作。
即使如果决定直接在内存中操作数据,您也需要比DataTable
更智能的格式。
答案 1 :(得分:3)
所有32位应用程序仅限于2GB of memory *。所以无论你如何分配RAM,你都会以2GB的速度运行。
如果您需要更多,则需要在64位系统上运行它并将其编译为64位。
答案 2 :(得分:1)
如果使用的RAM超出了可以解决的(或有),则会出现System.OutOfMemoryException
异常。
试试这段代码看看:
List<byte[]> foo = new List<byte[]>();
for (int i = 0; i < 10000; ++i )
foo.Add(new byte[1024*1024*1024]);
答案 3 :(得分:1)
是的,它会崩溃。这是我尝试过的示例代码:
class Program
{
static byte[] arr = new byte[1024 * 1024 * 1024];
static byte[] arr2 = new byte[1024 * 1024 * 1024];
static byte[] arr3 = new byte[1024 * 1024 * 1024];
static byte[] arr4 = new byte[1024 * 1024 * 1024];
static void Main(string[] args)
{
Console.ReadKey();
}
}
这是一个相当原始的测试程序。除非可以立即强烈访问全部数据,否则它可能已经被GC部分回收,因此不会崩溃。
您还可以将它们设为本地。但是,如果您进行发布构建(使用代码优化),则以下位的工作方式类似于魅力,因为未使用的数组(或通常是变量)可能会被优化掉:
static void Main(string[] args)
{
byte[] arr = new byte[1024 * 1024 * 1024];
byte[] arr2 = new byte[1024 * 1024 * 1024];
byte[] arr3 = new byte[1024 * 1024 * 1024];
byte[] arr4 = new byte[1024 * 1024 * 1024];
Console.ReadKey();
}
在 Debug Build (无代码优化)中,上面的位也崩溃了OutOfMemoryException
。
相反的领域当然不能随便离开。因此,无论代码是否由编译器优化,第一个示例都会崩溃。
答案 4 :(得分:0)
有关不同操作系统的物理内存限制,请参阅本文Memory Limits for Windows Releases。
但是,可以将运行为32位的.NET应用程序的限制从2GB增加到3GB。为此,您必须在可执行文件上运行editbin /LARGEADDRESSAWARE
。您可以在此处找到有关它的更多详细信息: