我正在做一些 Project Euler练习,我遇到了一个场景,我有想要大于 2,147,483,647(C# 中 int
的上限)的数组。
当然这些都是大数组,但是例如,我不能这样做
// fails
bool[] BigArray = new BigArray[2147483648];
// also fails, cannot convert uint to int
ArrayList BigArrayList = new ArrayList(2147483648);
那么,我可以有更大的阵列吗?
编辑: 这是一个 Sieve of Atkin ,你知道,所以我只想要一个非常大的 :D
最佳答案
任何时候你在处理这么大的数组时,你都应该尝试找到更好的解决方案。但话虽这么说,我仍然会尝试回答你的问题。
如本article所述.Net 中的任何对象都有 2 GB 的限制。对于所有 x86、x64 和 IA64。
As with 32-bit Windows operating systems, there is a 2GB limit on the size of an object you can create while running a 64-bit managed application on a 64-bit Windows operating system.
此外,如果您在堆栈上定义的数组太大,则会出现堆栈溢出。如果您在堆上定义数组,它将尝试将其全部分配到一个大的连续 block 中。最好使用在堆上具有隐式动态分配的 ArrayList。这不会让您超过 2GB,但可能会让您更接近它。
我认为只有在使用 x64 或 IA64 架构和操作系统时,堆栈大小限制才会更大。使用 x64 或 IA64,您将拥有 64 位可分配内存而不是 32 位。
如果您不能一次分配所有数组列表,您可能可以分段分配它。
在具有 6GB RAM 的 x64 Windows 2008 机器上使用数组列表并一次添加 1 个对象,我最多可以获得 ArrayList 的大小:134217728。所以我真的认为你必须找到一个更好的解决方案您的问题没有使用那么多内存。也许写入文件而不是使用 RAM。
关于c# - 数组的大小是否受制于int的上限(2147483647)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/573692/