【问题标题】:Fail to allocate large jagged array分配大锯齿数组失败
【发布时间】:2018-03-16 07:20:55
【问题描述】:

我正在尝试执行以下函数来创建和初始化一个大型锯齿状数组,其中TInt16NumOfRows10000NumOfColumns1127211

public static T[][] Create<T>(int NumOfRows, int NumOfColumns, T Value)
{
    var Result = new T[NumOfRows][];
    for (int i = 0; i < NumOfRows; i++ )
    {
        Result[i] = new T[NumOfColumns];
        for (int j = 0; j < NumOfColumns; j++)
        {
            Result[i][j] = Value;
        }
    }
    return Result;
}

据我了解,分配的总内存应约为 20 GB。机器的物理 RAM 为 16 GB,Windows 交换文件的大小约为 13 GB。但是,我得到了一个

OutOfMemoryException

在分配期间。该项目构建为 64 位可执行文件,App.config 使用了

<runtime>
    <gcAllowVeryLargeObjects enabled="true" />
</runtime>

设置。我错过了什么吗?分配这么多内存是不可能的吗?请注意,数组是锯齿状的,这意味着只有数组的行需要是连续的。您是否有任何建议是否可以在配置方面提供更多内存?访问内存还有哪些其他选项?

【问题讨论】:

  • 听起来你的记忆力差...你为什么认为这是错误的?
  • 我认为分配应该有效,因为 .NET 运行时能够使用 Windows 的虚拟内存。不是这样吗?还是虚拟内存不足?
  • 无法通过数据来判断,但我想您的操作系统和其他正在运行的进程至少使用了几个良好的内存 GB - 您是否有任何证据可以否定这一点?
  • 据我了解(通过检查 Windows 任务管理器),正在运行的进程使用了​​大约 3 GB 的 RAM。
  • 将这么多数据加载到 RAM 中并不常见。大多数处理 GB 数据的应用程序会将其存储在文件中并通过它流式传输,只提取手头任务的有趣数据。为什么要将所有内容都加载到 RAM 中?

标签: c# arrays out-of-memory 64-bit


【解决方案1】:

如果您使用的是 Visual Studio 2017,请打开项目属性并确保 Build -> Platform Target 为 Any CPU,并且您已取消选中“Prefer 32-bit”。

我能够在我只有 8GB 物理内存的 64 位机器上重现您的阵列(大约 22.7 GB)。

【讨论】:

  • 感谢您的帮助,但您提到的复选框已取消选中。
  • 当您的应用程序运行时,您是否在任务管理器中看到 *32 的名称?而你的操作系统是 64 位 Windows?奇怪的。只有在 vshost.exe 中运行时才会失败?
  • 我没有将实现作为应用程序运行,但我正在使用 Visual Studio 中的 VSTest。这有什么不同吗?
  • VSTest 对 64 位有粗略的支持,但请尝试选择测试 -> 测试设置 -> 默认处理器架构 -> X64 选项。
  • 再次,它适用于我的 vstext.executionengine.exe(在任务管理器中没有 *32)完整的 20+ GB。
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
  • 2013-06-21
相关资源
最近更新 更多