【问题标题】:C# Efficiently store large int dataC# 高效存储大型 int 数据
【发布时间】:2015-02-04 05:25:03
【问题描述】:

总而言之,我处于一个困境中,我无法决定/知道存储“简单”但大量 int 数据类型的最佳方法。

现在我正在使用扁平数组int[] TheData = new int[size * size];,因为我只存储 1 层,但现在我需要至少 3 层。最初的通过过程是使用:

Dictionary<uint, int[]> TheNewData = new Dictionary<uint, int[]>();(关键是层)

但我对字典没有太多经验,所以我相信这会导致通过数组索引访问数据时出现问题,例如平面数组 TheData[x + y * width] = ...

或者简单地说:

int[,] TheNewData = new int[LayerCount, size * size];

上面那个让我觉得很脏。

我什至可以将原始平面数组大小增加三倍并将偏移量应用于下一层...

无论如何,我还必须考虑到大得离谱的地图,比如说宽度 x 高度是 1,000 x 1,000 (图块),即 1,000,000 以int 的形式存储在某处的磁贴(我认为...)。所以数据访问需要相当快,因为​​我还要处理可能更新整个“active”层。

如果您能“解释”为什么您建议的方法最适合,我们将不胜感激,谢谢。

【问题讨论】:

  • 如果您要使用 [0, 1, ... N-1] 标识 N 个对象,则没有理由在数组上使用字典。
  • 数据稀疏吗?需要什么访问模式(随机访问或顺序访问)?
  • 数据在某些情况下是随机访问的,因此在绘制到画布时,tileIndex(0,1, ... N-1)相对于画布存储在数组中(tile( 1) 放置在 3x, 1y)。
  • 为什么二维数组会让你觉得脏?除了可能是因为它应该是一个三维数组?
  • 我从不喜欢二维数组,主要是因为我通常使用 c++ 编程,这可能说明了一切。所以我对 c# 了解不多,我很清楚有很多非常明显的差异。

标签: c# arrays dictionary storage


【解决方案1】:

如果您要存储多个 NxN 网格,int[,,] foo = new int[LayerCount, size, size]; 有什么问题?如果您进行随机访问,它很容易建立索引并且速度很快。如果你在做顺序访问,你可以使用交错数组获得更好的性能,但是初始化它们有点不方便。

多维数组(即int[,,])的另一个问题是它们需要一个连续的内存块。如果您只有三层 1000 x 1000,那不是问题。因为你说的只是 12 兆字节。但是,如果您的大小是 1,000,000 而不是 1,000,您将分配 12 giga字节,这可能会给您带来一些麻烦。

顺便说一句,锯齿状数组的形式为int[][][] foo = new int[LayerCount][][];,然后您必须单独初始化其他维度。不难,就是乱。但它确实需要一个连续的内存块,但如果你随机访问它,则会以一些运行时性能为代价。

或者,您可以使用混合:int[,][],您可以将其视为二维数组的数组。在这种情况下,每一层都是一个单独的分配。

无论如何,如果您知道层的大小并且知道有多少层,那么真的没有理由使用数组以外的任何东西。

您当然可以创建一个单一的一维数组行int[] messy = new int[LayerCount * size * size],并进行自己的索引。不过,这似乎是很多不必要的工作。

有关 C# 中数组的性能特征的一些信息,请参阅http://blog.mischel.com/2013/05/08/are-jagged-arrays-faster-than-rectangular-arrays/。我没有对三维数组进行任何性能比较,但我希望它们是相似的。

【讨论】:

  • 谢谢你,这确实解决了我的很多困惑。也很好的解释,再次感谢您。
猜你喜欢
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
  • 2017-04-09
相关资源
最近更新 更多