C# 64位VB.NET分配>;2GB内存(.NET bug?)

C# 64位VB.NET分配>;2GB内存(.NET bug?),c#,.net,vb.net,memory,64-bit,C#,.net,Vb.net,Memory,64 Bit,我有一个64位VB.NET应用程序,希望分配一个大小大于2GB的缓冲区 在下面的代码中,“new”和“ReDim”都抛出“OverflowException” 当这些函数仅接受带符号的32位值时,如何分配大于2GB的缓冲区 (这在C#中可能吗?) 编辑-我正在使用4GB内存运行WinXP 64 Dim width As Long = 19005 Dim height As Long = 32768 Dim buffer() As Byte = New Byte((width * height

我有一个64位VB.NET应用程序,希望分配一个大小大于2GB的缓冲区

在下面的代码中,“new”和“ReDim”都抛出“OverflowException”

当这些函数仅接受带符号的32位值时,如何分配大于2GB的缓冲区

(这在C#中可能吗?)

编辑-我正在使用4GB内存运行WinXP 64

Dim width As Long = 19005 Dim height As Long = 32768 Dim buffer() As Byte = New Byte((width * height * 4) - 1) {} Dim size As Long = (width * height * 4) - 1 ReDim buffer(size) 尺寸宽度等于长度=19005 长度为32768时的变暗高度 Dim buffer()作为字节=新字节((宽度*高度*4)-1{} 长度尺寸=(宽度*高度*4)-1 重拨缓冲区(大小)
以下作品[在理论上](C#语法):


编辑:使用固定大小分配的1GB数组创建类型。您可以通过shift键在Item属性中重新编制索引。

显然,即使在64位操作系统上运行的64位.net应用程序下,也不可能分配超过2GB的内存

我觉得这非常令人失望,完全不考虑64位应用程序和OSs的用途。我正在处理巨大的图像,希望能够同时处理RAM中的所有原始字节。现在我必须实现分页算法,将块限制在2GB

嘿,微软,你如何在即将发布的.NET版本中解决这个问题?是的,我说修理。那是因为它坏了。当你做这样愚蠢的事情时,64位应用程序将如何起飞。(你看得出我很生气)谢谢你的倾听


我认为非托管内存流可以满足您的需要


我认为,在垃圾收集环境中分配大量内存是个坏主意,因为大多数垃圾收集器都是针对小而短的对象进行优化的。因此,对于非常大的对象,使用原始内存通常是一种更好、性能更高的解决方案。

您可能需要使用内存映射文件来实现此目的,请查看函数。

您如何知道它是一个64位应用程序?它如何在process viewer中显示(如果您安排让它运行足够长的时间)?它似乎仍然被限制为2GB,因为它需要一个“整数”(32位有符号)参数。是的。读写时需要int32,但构造函数需要64位整数。它也不适用于VisualBasic,因为“VisualBasic不支持使用或返回不安全类型的API”。如果仔细阅读,这并不完全正确。他甚至提供了两个可行的解决方案。使用.net new/redim函数分配的内存不能超过2GB。你从哪里看出这不是真的。替代方案是更多的工作,至少在理论上应该是完全没有必要的。那个“大数组”类在我看来是可疑的,如果你付钱给我,我就不会使用它。像Paint.NET这样的自定义内存分配器可能很有用。
Array.CreateInstance(typeof(int[]), 0L);