代码之家  ›  专栏  ›  技术社区  ›  user79755

64位vb.net分配大于2GB的RAM(.net bug?)

  •  5
  • user79755  · 技术社区  · 16 年前

    我有一个64位的vb.net应用程序,想要分配一个大小为2GB的缓冲区。

    在下面的代码中,“new”和“redim”都会抛出“overflowException”。

    当这些函数只接受有符号的32位值时,如何分配缓冲区?

    (这在C中是可能的吗?)

    编辑 -我正在运行带有4GB内存的Winxp64。

    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 回复  |  直到 16 年前
        1
  •  2
  •   user79755    16 年前

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

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

    嘿,微软,你在即将发布的.NET版本中如何解决这个问题?是的,我说 修理。 那是因为它坏了。当您这样做时,您希望64位应用程序如何起飞? 愚蠢的 像这样的事情。(你能告诉我吗 恼怒的 感谢聆听。

    Link

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

        2
  •  2
  •   Paul van Brenk    16 年前

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

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

        3
  •  0
  •   Sam Harwell    16 年前

    [理论上]以下作品(C句法):

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

    编辑:使用固定大小的分配了1GB数组的类型。您可以通过移位重新索引项属性。

        4
  •  0
  •   Otávio Décio    16 年前

    为此,您可能需要使用内存映射文件,请查看 MapViewOfFile 功能。

    推荐文章