64位VB.NET分配> 2GB的RAM(.NET bug?)

时间:2009-07-31 19:57:11

标签: 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 * 4) - 1) {}

Dim size As Long = (width * height * 4) - 1
ReDim buffer(size)

4 个答案:

答案 0 :(得分:2)

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

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

嘿微软,你想知道你在即将发布的.NET版本中解决了这个问题吗?是的,我说修复。那是因为它破了。当您执行愚蠢这样的事情时,您如何期望64位应用程序起飞? (你能否告诉我恼火。)感谢您的聆听。

Link

http://blogs.msdn.com/joshwil/archive/2005/08/10/450202.aspx

答案 1 :(得分:2)

我认为UnmanagedMemoryStream可以满足您的需求。 MSDN doc for UnmanagedMemoryStream

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

答案 2 :(得分:0)

以下工作[理论上](C#语法):

Array.CreateInstance(typeof(int[]), 0L);

编辑:创建一个具有固定大小的1GB数组分配数组的类型。您可以通过班次在Item属性中重新编制索引。

答案 3 :(得分:0)

您可能必须使用内存映射文件,请查看MapViewOfFile 函数。