我想制作一个大小为 10^9 元素的数组,其中每个元素可以是相同大小的整数。我总是OutOfMemoryException
在初始化行得到一个。我怎样才能做到这一点?
如果这是不可能的,请提出替代策略?
我想制作一个大小为 10^9 元素的数组,其中每个元素可以是相同大小的整数。我总是OutOfMemoryException
在初始化行得到一个。我怎样才能做到这一点?
如果这是不可能的,请提出替代策略?
在 .net 4.0 或更早版本中,即使在 64 位进程中,数组也被限制为 2GB。所以对于十亿个元素,支持的最大元素大小是两个字节,但一个int
是四个字节。所以这行不通。
如果你想拥有一个更大的集合,你需要自己编写,由多个数组支持。
在 .net 4.5 中可以避免此限制,有关详细信息,请参阅 Jon Skeet 的答案。
假设您的意思int
是元素类型,如果您使用的是 64 位 CLR,则可以使用 .NET 4.5 执行此操作。
您需要使用<gcAllowVeryLargeObjects>
配置设置。默认情况下未启用。
如果您使用的是较旧的 CLR,或者您使用的是 32 位机器,那么您就不走运了。当然,如果您使用的是 64 位机器,但只是旧版本的 CLR,您可以将“一个大数组”封装到一个单独的对象中,该对象具有一个较小数组的列表……您甚至可以实现IList<int>
它这样大多数代码就不需要知道您并没有真正使用单个数组。
(如评论中所述,您仍然只能创建一个包含 2 31个元素的数组;但您对 10 9的要求正好在此范围内。)
我认为您不应该将所有这些数据加载到内存中,将其存储在文件中的某个位置,然后创建一个可以作为数组工作但实际上从文件中读取和写入数据的类
这是一般的想法(这当然不能正常工作,另外你必须在编写它和其他一些东西之前将你的 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); }
}
}
这样,您将拥有像数组一样工作的东西,但数据将存储在您的硬盘上