C#高效存储大int数据

标签 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];

上面这个让我感觉很肮脏。

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

无论如何,我还必须考虑到大得离谱的 map ,比如宽度x高度是1,000 x 1,000(图 block ),即1,000,000 图 block 存储为 int在某个地方(我认为...)。因此数据访问需要相当快,因为​​我还要处理可能更新整个“事件”层的问题。

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

最佳答案

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

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

顺便说一句,锯齿状数组的形式为 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/ 。我还没有与三维数组进行任何性能比较,但我希望它们是相似的。

关于C#高效存储大int数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27326097/

相关文章:

java - 存储与映射中的键相对应的多个值

c# - ASP.NET DateTime 无法正确转换

c# - 查找windows服务中的堆栈溢出异常

python - 在没有中间体的情况下生成点输出切片

java - 将 json 数据映射到 java bean

python - 我可以使用一个值作为另一个字典的键吗?

C# 日期之间出现的月份和日期

c# - 如何动态添加任意数量的线系列到WPF工具包图表中?

javascript - 从javascript中括号之间的多个数组循环

arrays - 在 Fortran 中创建具有不同类型元素的数组