C# 高效存储大型整数数据

本文关键字:整数 数据 大型 存储 高效 | 更新日期: 2023-09-27 18:33:22

晚上,我陷入了困境,我无法决定/知道存储"简单"但大量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的某个地方(我认为......因此,数据访问需要相当快,因为我还要处理更新整个">活动"层。

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

C# 高效存储大型整数数据

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

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

顺便说一下,交错数组的形式是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/。我没有对三维数组进行任何性能比较,但我希望它们是相似的。