多维数组的限制

时间:2011-09-24 11:37:28

标签: vb.net multidimensional-array size

我刚制作了一个1024 x 1024 x 1024的多维数组。我得到OutOfMemory异常。什么是可以安全使用的最大尺寸的多维数组?我在VB.net中这样做,所以所有的.net答案都可以接受。

修改

当我说安全时,我的意思是,几乎任何计算机的尺寸都很好。在32位操作系统上可以平稳运行的大小。我没有意识到1024的尺寸是4G。我希望得到第16个。

3 个答案:

答案 0 :(得分:1)

嗯,1024 * 1024 * 1024是一个非常大的数字。假设您正在使用整数数组,那么这相当于4 GiB的内存,不计算管理多个数组的开销。

由于没有进程可以分配超过2 GiB的内存,因此您已经超过了操作系统强加的硬限制(不是 VB或.NET!)。 .NET本身没有实际限制,因为达到了更快的机器限制。

答案 1 :(得分:1)

如果没有至少两个其他细节,这个问题毫无意义:

  • 计算机上的可用内存
  • 每个记忆的大小

获取这些数字,然后进行数学计算。假设未装箱的32位整数,1024 * 1024 * 1024阵列将消耗大约 4 GB (实际上更多,.NET阵列不是C阵列并且有一些开销;我对他们的知识不够了解实现以估计开销有多大)。您可以使用这样的阵列, if 你想要将程序的使用限制在64位计算机上(超过4 GB,至少因为你编程赢了)是唯一一个正在运行的内存量。可能你打算运行程序的计算机并不那么强大。然后你必须弄清楚你想要/需要支持的最小值,并做一些数学计算来估计你可以轻松消耗多少内存。

答案 2 :(得分:1)

.NET对象不能超过2千兆字节。即使这样,在32位操作系统上,也很可能在可寻址的虚拟内存空间中找到一个大到足以容纳这么大阵列的漏洞。程序启动后,您可以立即获得大约600兆字节,在地址空间开始变得碎片化后,从那里快速下山。当仍然有半个演出空间时,轰炸90 ​​MB的分配并不是非常不寻常。

您需要使用jagged arrays和64位操作系统。如果真的需要如此庞大的数组,那就进行一些内省。在System.Collections.Generic可用之后,数组有点像旧学校。使用与数组一样快的集合类,只允许您为实际使用的内容付费。推荐使用。