【问题标题】:64-Bit VB.NET Allocating > 2GB of RAM (.NET bug?)64 位 VB.NET 分配 > 2GB 的 RAM(.NET 错误?)
【发布时间】:2010-11-15 22:04:14
【问题描述】:

我有一个 64 位 VB.NET 应用程序,并且想要分配一个大小 > 2GB 的缓冲区。

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

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

(这在 C# 中可能吗?)

编辑 - 我正在运行带有 4GB RAM 的 WinXP 64。

暗淡宽度 As Long = 19005 暗淡高度 As Long = 32768 Dim buffer() As Byte = New Byte((width * height * 4) - 1) {} 暗淡尺寸 As Long = (width * height * 4) - 1 ReDim 缓冲区(大小)

【问题讨论】:

  • 你怎么知道它是 64 位应用程序?它是如何在进程查看器中显示的(如果您安排让它运行足够长的时间)?

标签: c# .net vb.net memory 64-bit


【解决方案1】:

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

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

嘿,Microsoft,您如何在即将发布的 .NET 版本中解决此问题?是的,我说修复。那是因为它坏了。当您愚蠢做这样的事情时,您如何期望 64 位应用程序起飞。 (你能说我恼火吗。)谢谢你的收听。

Link

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

【讨论】:

  • 如果您仔细阅读,这并不完全正确。他甚至提供了 2 个可行的解决方案。
  • 确实,您不能使用 .net new / redim 函数分配超过 2GB 的空间。你从哪里看出这不是真的。替代方案的工作量更大,至少在理论上应该是完全没有必要的。
  • 那个“大数组”类在我看来很可疑,如果你付钱给我,我就不会使用它。像 Paint.NET 这样的自定义内存分配器可能很有用。
【解决方案2】:

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

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

【讨论】:

【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2013-03-25
      • 2014-02-03
      • 2018-10-07
      • 2017-04-30
      • 2020-09-13
      • 2010-10-23
      • 2013-02-25
      • 1970-01-01
      • 2010-09-07
      相关资源
      最近更新 更多