【问题标题】:Change C# array index type to Int64 [duplicate]将 C# 数组索引类型更改为 Int64 [重复]
【发布时间】:2023-03-17 23:17:01
【问题描述】:

我有一个程序,我必须处理非常大的数组。 我需要使用二维数组。

我使用了经典的bool[,],但是当我试图声明它时,当索引太大时它抛出了System.OutOfMemoryException。 (使用bool[,] foo = new bool[width + bar, height])。 widthbar 这两个数字都非常大,所以我想,它刚刚超过了索引。

如何将索引类型更改为 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 我已经扩展了问题。你有什么想法吗?

标签: c# arrays


【解决方案1】:

在这里使用字典并没有错,因为如果您要制作自定义解决方案,您很可能会手动使用字典。它还支持几乎所有你能想到的LINQ methods

【讨论】:

  • 程序在使用 3.7GB RAM 后被杀死 :-D screenshot 0.7gb before death 我明天会在具有巨大 RAM 的更好的 PC 上再试一次,但我不认为,它会有所帮助
  • 我刚刚又看了你的问题,你需要重新考虑你在用你的数组/字典做什么。为什么你需要一次保存这么多数据?考虑分块或动态处理数据,而不是等待 RAM 耗尽。
  • 谢谢,我会看看你写的东西,并尝试在不使用大量收藏的情况下找到另一种方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 2018-07-26
  • 1970-01-01
  • 2015-11-23
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多