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

5
我有一个64位的VB.NET应用程序,想要分配一个大于2GB的缓冲区。
在以下代码中,“new”和“ReDim”都会抛出“OverflowException”。
当这些函数仅接受带符号32位值时,如何分配大于2GB的缓冲区?
(在C#中是否可能实现?)
编辑 - 我正在运行带有4GB RAM的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)

1
你怎么知道它是一个64位应用程序?如果你让它运行足够长的时间,它会如何显示在进程查看器中? - Martin v. Löwis
4个回答

2

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

我觉得这很令人失望,完全没有考虑到64位应用程序和操作系统的用途。我正在处理巨大的图像,并希望能够一次性在RAM中处理所有原始字节。现在我必须实现分页算法来限制每个块为2GB。

嘿,微软,你们在即将发布的.NET版本中修复一下这个问题怎么样?是的,我说的是修复。那是因为它是有问题的。当你做出愚蠢的决定时,你如何指望64位应用程序取得成功。(你可以看出我很恼火了。)谢谢你们的聆听。

链接

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


如果你仔细阅读,那并不完全正确。他甚至提供了两个可行的解决方案。 - NotMe
1
确实如此,使用.net new / redim函数无法分配超过2GB的内存。您在哪里看到它不是真的呢?替代方案需要更多的工作,并且理论上应该是完全不必要的。 - user79755
那个“大数组”类看起来很可疑,就算你给我钱我也不会用它。像Paint.NET一样的自定义内存分配器可能会有用。 - user79755

2
我认为UnmanagedMemoryStream可以满足您的需求。使用原始内存通常是处理非常大的对象的更好且更高效的解决方案,因为大多数垃圾收集器都针对小型和短寿命对象进行了优化。请参阅UnmanagedMemoryStream的MSDN文档

1
似乎仍然受限于2GB,因为它需要一个“整数”(32位有符号)参数。 - user79755
是的。在读写时使用int32,但构造函数使用64位整数。http://msdn.microsoft.com/zh-cn/library/dd267517(VS.100).aspx - Paul van Brenk
2
它也不适用于Visual Basic,因为“Visual Basic不支持使用或返回不安全类型的API。” http://msdn.microsoft.com/en-us/library/zw66yex7.aspx - user79755

0
以下是理论上可行的代码(C#语法):
Array.CreateInstance(typeof(int[]), 0L);

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


0
你可能需要使用内存映射文件来完成这个任务,可以查看MapViewOfFile函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接