【发布时间】:2023-03-17 23:17:01
【问题描述】:
我有一个程序,我必须处理非常大的数组。 我需要使用二维数组。
我使用了经典的bool[,],但是当我试图声明它时,当索引太大时它抛出了System.OutOfMemoryException。 (使用bool[,] foo = new bool[width + bar, height])。 width 和 bar 这两个数字都非常大,所以我想,它刚刚超过了索引。
如何将索引类型更改为 Int64(长)?我知道我可以使用Dictionary<ulong, bool>,但它会迫使我重写我的应用程序中的几乎所有代码,而且我发现数组比使用 Dictionary 更舒服,特别是当我已经有了我需要但我不需要的 LINQ 方法时知道,它是否适用于二维字典。
谢谢,彼得
编辑 1:
这是代码(注意:我刚刚用sizeX = 2000000000测试过,它抛出了异常):
bool[,] pole = new bool[sizeX, maxY];
问题是,我有许多带有 X、y 长度和 x 长度的对象(Y 始终为 0)。我有一个数组,在每个位置上,有或没有对象图块。
所以我只需将坐标 X、宽度和高度和位置图块放入数组中。
关键是,X 可以是负,所以当我需要定位例如 10 个对象时,我会得到最低的 X(并保存它,例如 largestNegativeX = -999)并且在将对象定位到数组之前,我添加到每个对象的 X object.X += -largestNegativeX。然后我计算出数组宽度(例如2000000000)并尝试声明数组。这就是引发异常的地方。
【问题讨论】:
-
为此使用BitArray。它将布尔值存储为位并消耗更少的内存。
-
这看起来可能是 x y 问题。如果您询问您的特定用例,您可能会得到更好的解决方案。
-
这里用字典没什么问题..
-
How can I change index type to Int64 (long)- 你不能,因为relative addressing is limited to a signed 32-bit offset value。还有OutOfMemoryException表示数组本身太大了,不是索引值太大,否则就是OverflowException。 -
@Logarr 我已经扩展了问题。你有什么想法吗?