C # Эффективно хранить большие данные int

Вечером, я в затруднительном положении, когда я не могу решить/знать лучший метод для хранения «простых», но больших объемов 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 высота были 1000 x 1000 (тайлов), это 1 000 000 плитки должны храниться как int где-то (я думаю...). Таким образом, доступ к данным должен быть достаточно быстрым, так как я также буду иметь дело с потенциальным обновлением всего "активного" слоя.

Если бы вы могли "объяснить", почему предложенный вами метод лучше всего подходит, мы были бы вам очень признательны, спасибо.


person SharkBytes    schedule 05.12.2014    source источник
comment
Если вы собираетесь иметь N объектов, идентифицируемых [0, 1, ... N-1], нет причин использовать словарь вместо массива.   -  person Mephy    schedule 06.12.2014
comment
данных мало? Какой шаблон доступа необходим (случайный доступ или последовательный)?   -  person alexm    schedule 06.12.2014
comment
В некоторых случаях доступ к данным осуществляется случайным образом, поэтому при рисовании на холсте tileIndex (0,1,... N-1) сохраняется относительно холста в массиве (плитка (1) размещается в 3x, 1y) .   -  person SharkBytes    schedule 06.12.2014
comment
Почему двумерный массив заставляет вас чувствовать себя грязным? За исключением, возможно, того, что это должен быть трехмерный массив?   -  person Jim Mischel    schedule 06.12.2014
comment
Мне никогда не нравились 2D-массивы, в основном потому, что я обычно программирую на С++, что может сказать само за себя. Так что у меня мало знаний о С#, и мне ясно, что есть много очень четких различий.   -  person SharkBytes    schedule 06.12.2014


Ответы (1)


Если вы храните несколько сеток NxN, что не так с int[,,] foo = new int[LayerCount, size, size];? Это легко индексировать и достаточно быстро, если вы используете произвольный доступ. Если вы выполняете последовательный доступ, вы можете получить лучшую производительность с зубчатыми массивами, но их инициализация немного неудобна.

Другая проблема с многомерными массивами (т. е. int[,,]) заключается в том, что им требуется один непрерывный блок памяти. Если у вас всего три слоя 1000 x 1000, это не проблема. Потому что вы говорите только о 12 мегабайтах. Но если бы ваш размер был 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/. Я не проводил никаких сравнений производительности с трехмерными массивами, но ожидаю, что они будут похожими.

person Jim Mischel    schedule 05.12.2014
comment
Спасибо, это, безусловно, прояснило мою путаницу. Также отличное объяснение, еще раз спасибо. - person SharkBytes; 06.12.2014