数组中的内存不足异常
本文关键字:异常 内存不足 数组 | 更新日期: 2023-09-27 17:56:31
我想创建一个大小为 10^9 的元素数组,其中每个元素可以是相同大小的整数。我总是在初始化行得到一个OutOfMemoryException
。我怎样才能做到这一点?
如果这是不可能的,请提出替代策略?
在 .net 4.0 或更早版本中,数组限制为 2GB,即使在 64 位进程中也是如此。因此,对于十亿个元素,支持的最大元素大小为 2 个字节,但int
为 4 个字节。所以这是行不通的。
如果你想有一个更大的集合,你需要自己编写它,由多个数组支持。
在 .net 4.5 中,可以避免此限制,有关详细信息,请参阅 Jon Skeet 的答案。
假设你的意思是int
作为元素类型,如果你使用的是 64 位 CLR,则可以使用 .NET 4.5 执行此操作。
您需要使用<gcAllowVeryLargeObjects>
配置设置。默认情况下,此功能不处于打开状态。
如果您使用的是较旧的 CLR 或使用的是 32 位计算机,那么您就不走运了。当然,如果您使用的是 64 位机器,但只是旧版本的 CLR,则可以将"一个大数组"封装到一个单独的对象中,该对象具有较小的数组列表......您甚至可以以这种方式实现IList<int>
,这样大多数代码就不需要知道您实际上并没有使用单个数组。
(如注释中所述,您仍然只能创建一个包含 231 个元素的数组;但您对 109 个元素的要求完全在此范围内。
我认为您不应该将所有这些数据加载到内存中,将其存储在文件中的某个位置,并创建一个可以用作数组但实际上从文件中读取和写入数据的类
这是一般的想法(这当然行不通,而且你必须在编写它和其他一些东西之前将你的 int 值转换为 byte[] 数组)
public class FileArray
{
Stream s;
public this[int index]
{
get { s.Position = index * 4; return s.Read(); }
set { s.Position = index * 4; s.Write(value); }
}
}
这样,您将拥有像数组一样工作的东西,但数据将存储在硬盘驱动器上