C#有效地存储大型int数据

时间:2014-12-05 23:03:22

标签: c# arrays dictionary storage

总之,我处于一种困境,我无法决定/知道存储“简单”但大量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 < / strong>将瓷砖存储为int的某处(我认为......)。所以数据访问需要相当快,因为​​我还要处理可能更新整个“活动”层。

如果您可以请“解释”为什么您建议的方法最适合我们,非常感谢,谢谢。

1 个答案:

答案 0 :(得分:4)

如果您要存储多个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/。我还没有对三维数组进行任何性能比较,但我希望它们是相似的。