【发布时间】:2018-03-16 07:20:55
【问题描述】:
我正在尝试执行以下函数来创建和初始化一个大型锯齿状数组,其中T 是Int16,NumOfRows 是10000,NumOfColumns 是1127211。
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