2013-11-20 2 views
0

Я немного сомневаюсь, какую коллекцию использовать для наших данных.Выбор нужной сортированной коллекции

Домен это (пример):

Для каждого супермаркета добавить новый элемент в коллекцию с меткой времени и общей суммой каждый раз, когда любой клиент платит в реестре.

В настоящее время мы делаем это:

У нас есть словарь коллекции с ключом = UniqueSupermarketID и значение представляет собой список < {метка времени, количество}>

Каждый раз, когда клиент платит нам просто добавить новый элемент сбор для конкретного супермаркета.

Нам нужно извлечь данные из этого словаря таким образом, что:

Для указанного супермаркета, получить новейший объект кассового аппарата с временной меткой сравнявшись «некоторые метками»

В настоящее время мы делаем это так:

supermarketDictionary["supermarket_01"] 
    .OrderByDescending(i => t.TimeStamp) 
    .FirstOrDefault(i => i.TimeStamp == 'some timestamp') 

Это, очевидно, быстро начинает работать как дерьмо - поэтому я пытаюсь выяснить, какая коллекция хранит данные вместо этого.

Я рассматриваю, используя обычный словарь, чтобы провести «супермаркет ID < -> кассовых список» отношения и с помощью SortedDictionary для временных меток/сумм, используемых в качестве ключей.

Правильно ли это? Конечно, мне нужно было бы правильно выполнить IComparable в метке времени, чтобы заставить ее работать правильно.

Update 2014-01-03:

Есть в настоящее время около 7 миллионов строк в списке в вопросе. Обычаи списков в нашей системе были идентифицированы как эти:

_states 
    .OrderBy(x => x.TimeStamp) 
    .FirstOrDefault(x => x.WtgId == wtgId && x.IsAvailable && x.TimeStamp >= timeStamp); 

_states 
    .Where(x => x.WtgId == wtgId && x.IsAvailable && x.TimeStamp >= timeStamp && x.TimeStamp <= endDateTime) 
    .OrderBy(x => x.TimeStamp).ToList(); 

_states.Remove(state); 

if (!_states.Contains(message)) 
    _states.Add(message); 

Спасибо,

/Jesper Копенгаген, Дания

+0

Если вы используете огромное количество данных, используйте базу данных. Это единственный масштабируемый и рациональный способ, а затем загружать только нужные данные. – user1567896

+0

Где хранятся ваши данные? В базе данных? Если да, то какой? – Oliver

+0

Я предполагаю, что у вас есть db за ним. Поэтому просто дайте db выполнить эту работу за вас. –

ответ

1

EDIT: на основе обновления

Все правильно, видя, что вам действительно нужно, помогает принять правильное решение.Если данные поступают уже в порядке нет необходимости в отсортированном коллекции и ваши четыре обыкновений могут быть сведены к одному ->

Поиск один элемент, который соответствует определенным критериям

  • добавляющие с проверкой существования - добавление - это дешевая операция в неупорядоченных коллекциях, а проверка существования - это просто поиск одного элемента.
  • удаление по предмету также не более одного, проходящего через коллекцию, плюс сама операция удаления, которая также довольно дешева (не в массив, если сделано много раз, хотя)

Попробуйте использовать PLINQ и тщательно измерьте, как он работает с LINQ. С таким количеством записей разница должна быть приятной.

_states.AsParallel().FirstOrDefault(...); 

Это будет просто создать несколько потоков на фоне, и каждый из них будет искать какую-то часть коллекции и на конечные результаты объединяются. .NET framework должна выбрать для вас наилучшее количество потоков, но если вам захочется попробовать, добавьте .WithDegreeOfParallelism(x), где x - это ряд потоков, которые он будет использовать.

Смежные вопросы