我有一个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)
答案 0 :(得分:2)
显然,即使在64位操作系统上运行的64位.net应用程序,也不可能分配超过2GB的数据。
我发现这非常令人失望,完全不考虑64位应用程序和操作系统的用途。我正在处理巨大的图像,并希望能够同时处理RAM中的原始字节。现在我必须实现分页算法以将块限制为2GB。
嘿微软,你想知道你在即将发布的.NET版本中解决了这个问题吗?是的,我说修复。那是因为它破了。当您执行愚蠢这样的事情时,您如何期望64位应用程序起飞? (你能否告诉我恼火。)感谢您的聆听。
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 函数。