我正在创build一个需要使用大量RAM的.NET应用程序(C#)。 我最近知道,在32位版本的Windows XP上,我只能使用2 GB,除非我使用/3Gb
开关,并在可执行头文件中设置IMAGE_FILE_LARGE_ADDRESS_AWARE
标志。 但是,因为我正在开发一个.NET应用程序,我想我不能直接修改可执行文件,可以吗? 那么,我该怎么做,让我的应用程序使用3 GB?
.NET EXE仍然是一个标准的PE文件; 所以你可以尝试使用editbin /LARGEADDRESSAWARE
来设置标志,但是请注意,如果你正在使用类似ClickOnce的东西(因为它保持了文件的加密散列),这是行不通的。
但是,请注意,就单个对象/数组的最大大小而言,您仍将具有相同的.NET限制。 对于大量的内存,x64是一个更好的主意。
/ 3GB开关在OS引导加载程序上,而不是在您的应用程序上。 (编辑:它也存在于本机C / C ++编译器,但不是C#编译器)就您的应用程序而言,它会请求内存,操作系统会将它提供给您的进程。 然而,在程序使用虚拟内存之前,您还可以访问另外1个gig(可能并不总是得到3gig,这取决于您的硬件外设)。
正如Marc Gavell指出的那样,您可能需要运行命令“editbin / LARGEADDRESSAWARE my.exe”作为exe的后期构建选项来启用它。 找到一个MS的人在这里谈论它的参考: MS论坛
我建议你看看你的程序,看看你是否可以重新构建它使用更少的内存。 也许你可以用更小的块来处理一个数据集,而不是一次把所有的东西加载到内存中?
您还应该增加进程的最大工作集大小:请参阅SetProcessWorkingSetSize API。
那么,我不确定这一点,但这是我的想法:
.NET可执行文件可以通过两种方式编译 – 独立于平台和平台。 默认情况下,它们是平台独立的,代码是(正如其他答案中所提到的)在运行程序时接受平台特定的代码。
现在,例如,如果您的可执行文件是这些独立于平台的文件之一,并且在64位操作系统上运行,那么它将被打乱到64位代码,对不对? 因此,它将能够解决更多的3GB的RAM。
我想说的是 – 我不认为这是什么写在PE头什么。 可用内存的实际数量由.NET运行时决定,而运行时则依次查看当前平台并生成最佳的JIT代码。
我认为你不应该担心/ 3GB开关,因为.NET会为你处理。 信任.NET! 🙂
您可以尝试通过命名管道使用Remoting,并通过物理上拥有更多进程来获取更多内存。
如果你正在做任何形式的互操作(和普通的.Net套接字统计在这里),你应该创建一个对象缓存(例如与套接字一个字节[]缓冲区),在应用程序启动时分配大量的这些对象。
你应该阅读这篇文章 。
据我所知,/ 3GB交换机只能用于Windows server(2000或2003),而不能用于Windows XP。 您需要在boot.ini文件的末尾写入/ 3GB。 这样,对于应用程序,操作系统启用更多的内存,通常分配给内核进程使用。 然而,/ 3GB并不意味着你可以使用3GB的内存,它可以使用更多的内存,但不一定是3GB。 对于.net应用程序,就我所记得的情况而言,使用/ 3GB开关,可以使用高达1.8GB的内存。 顺便说一句,你也可能想检查/ PAE开关。