【问题标题】:Use the 3Gb of memory in 32 bits applications在 32 位应用程序中使用 3Gb 内存
【发布时间】:2012-09-18 04:36:09
【问题描述】:

我正在开发一个导入大量数据的应用程序,在一些并行线程中。

有时我得到 OutOfMemoryException(当我使用 1.5、1.7GB 的内存时)。

没什么大不了的,我想我会把它做成一个 64 位的程序(因为它不是那么大)。但是由于 .Net 错误(不能有 64 位的十进制主键),我无法制作 64 位程序。(description of the problem 并且我发现了许多其他情况。我无法更改任何内容数据库,甚至不是类型或添加视图)。

我只需要 1.5-1-7GB 的 RAM。如果我能达到 2.5GB,我会很高兴的。

我阅读了一些关于“LARGEADDRESSAWARE”的内容,但我没有找到在我的 Visual Studio 上设置它的位置,以及大多数其他提示我应该修改 boot.ini 文件。

但由于我的计算机已经是 64 位计算机(具有类似 8GB 的​​内存),我认为我不必在这里做任何事情。

那么我应该怎么做才能访问那些 3GB 的内存呢?

【问题讨论】:

  • 你在做什么,需要所有这些都在内存中?仅仅因为您正在导入数据并不意味着数据需要或应该在整个过程中完全处于内存中。 “做一个管道,而不是一个桶”
  • 32bit 应用程序只能寻址 4gb 的 ram 而不是 32gb
  • 这不是“一次”,这是因为我有几个并行进程来读取和处理可变数量的数据。但这不是重点
  • @DanielPowell 我的错,我的意思是 3Gb

标签: c# .net memory


【解决方案1】:

使用 editbin 设置 LARGEADDRESSAWARE 标志,如 Can I set LARGEADDRESSAWARE from within Visual Studio? 中建议的那样。

editbin /largeaddressaware $(TargetPath) 

您需要运行 x64 版本的 Windows,或者如您提到的 32 位系统更改 Boot.ini 以允许应用程序使用 3Gb 的地址空间和 /3GB 开关。

【讨论】:

    【解决方案2】:

    32 位应用程序具有 4GiB 的虚拟地址空间。如果我没记错的话,Windows 默认将其拆分为 2GiB 用于应用程序(包括代码、堆栈、数据)和 2GiB 用于系统。

    应该有一种方法可以将应用程序的 3 GiB 和系统的 1 GiB 更改为 1 GiB,但我认为在任何情况下您都无法超越。

    【讨论】:

      猜你喜欢
      • 2012-01-30
      • 2019-08-29
      • 1970-01-01
      • 2012-12-27
      • 2016-10-28
      • 2015-11-05
      • 2010-09-07
      • 1970-01-01
      • 2014-03-12
      相关资源
      最近更新 更多