多维浮点数数组分配崩溃

3

我正在尝试分配一个非常大的多维浮点数组,但当超过某些维度时会出现内存不足异常问题。

//Doesn't crash
float[,] newArr = new float[40000, 5000];

//Crashes
float[,] newArr1 = new float[45000, 5000];

//Doesn't crash
float[,] newArr2 = new float[40000000, 5];

//Crashes
float[,] newArr3 = new float[45000000, 5];

我不确定问题出在哪里,我知道数组大小上限为2GB和40亿个元素,但这两种方法都不能限制。此外,我无法使用其他数据结构,因为我需要将[,]传递给外部API调用。有人知道这里可能发生了什么吗? 谢谢!


它发生在我的32位应用程序上 @ .NET 4.5.1,Windows 7,8 GB内存。 - DDushaj
6
45000 x 5000 x 4大约等于900兆字节。在32位进程中无法处理这么大的数据,因为可用地址空间最大只有大约650兆字节,而且随着程序运行一段时间后,这个空间会迅速减少。为了解决这个问题,可以取消程序中的抖动强制机制,将其作为64位进程运行。右键单击EXE项目 > 属性 > 编译选项卡。在8TB地址空间中具有许多非常大的空间。 - Hans Passant
@HansPassant如果您不介意将其标记为答案,我很乐意这样做 :) - DDushaj
只需将注释复制/粘贴/修饰到帖子中,并将其标记为答案。 - Hans Passant
2个回答

3

我对你的代码的经验是,在32位模式下编译(和运行)时它不起作用。如果我切换到64位构建模式,则可以正常工作。

因此,请打开您的项目设置>编译,并将平台目标设置为x64。


3

来自Hans Passant

45000 x 5000 x 4大约等于900兆字节。在32位进程中,你无法获得这么大的内存空间,可用地址空间中最大的空洞在启动时大约为650兆字节,在程序运行一段时间后,这个空洞迅速缩小。只需删除强制JIT编译器的设置,让程序以64位进程运行即可。右键单击EXE项目>属性>编译选项卡。在8TB的地址空间中有很多非常大的空洞。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接