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 масиви най-вече защото обикновено програмирам на c++, което може да каже всичко. Така че нямам много познания по c# и ми е ясно, че има много много различни разлики.   -  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