2012-02-28 3 views
4

Я пытаюсь хранить значительное количество данных котировки на фондовом рынке в переменной для запроса в памяти. Мне нужно быстро узнать последние данные о рынке для идентификатора запаса и запросить конкретные длины истории для определенного запаса.Лучший способ хранения большого количества данных запаса в памяти (переменная)

Например, я мог бы получать данные на складе ID 5342 (всегда числовые) каждые несколько секунд ... моя первоначальная мысль состоит в том, чтобы построить массив SortedDictionary, причем ключ SortedDictionary является DateTime цитаты и его значение являясь моей настраиваемой структурой рыночных данных. Тогда внешний массив будет идентификаторы акций ... так что я мог бы назвать:

RecentPrice = PriceData[StockID].Values.Last(); 

Или я мог бы итерацию назад через тот запас по SortedDictionary, пока я не попал ключ старше диапазона времени я ищу.

Однако я чувствую, что должен быть лучший (более эффективный) метод. Есть идеи?

Редактировать: Вместо массива SortedDictionaries ... Словарь SortedDictionaries может быть лучше. Например:

public static Dictionary<int, SortedDictionary<DateTime, StockData>> PriceData = 
    new Dictionary<int, SortedDictionary<DateTime, StockData>>(); 

затем:

RecentPrice = PriceData[StockID].Values.Last(); 

Спасибо!

ответ

2

Словари и хеш-таблицы в целом подходят для точных совпадений. Но когда вы хотите «первая дата/время не раньше X», отсортированный список будет работать лучше всего, потому что поиск - это двоичный поиск. Тем более, что вы только добавляете данные, а не вставляете их.

+0

Отлично, спасибо! – Harry

0

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

0

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

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

0

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

Также, если вам нужны различные запросы к данным. База данных в памяти - лучший выбор. Я использую SqlLite для выполнения аналогичной функции в одном из моих проектов и очень хорошо обрабатывает различные требования, потому что я могу использовать sql.