2011-04-01 5 views
6

Я хочу использовать карту поиска или словарь в приложении C#, но ожидается, что он будет хранить 1-2 ГБ данных.Как я могу использовать очень большой словарь в C#?

Может кто-нибудь скажет, смогу ли я по-прежнему использовать класс словаря, или если мне нужно использовать какой-либо другой класс?

EDIT: У нас есть существующее приложение, которое использует базу данных оракула для запроса или поиска объектов. Это, однако, слишком медленно, поскольку одни и те же объекты неоднократно запрашиваются. Я чувствовал, что может быть идеальным использовать карту поиска для этого сценария, чтобы улучшить время отклика. Однако я беспокоюсь, если размер сделает это проблема

+0

Вы пытались развернуть экземпляр словаря, который использует столько памяти? Кроме того, это приложение будет развернуто на 32 или 64-битной системе? – RQDQ

+1

Почему словарь или структура данных в памяти? Почему не база данных? –

+2

В SqlLite есть классная память, которая может быть интересна вашей ситуации. – gt124

ответ

7

Короткий ответ

Да. Если у вашей машины достаточно памяти для структуры (и накладных расходов остальной части программы и системы, включая операционную систему).

Длинный ответ

Вы уверены, что хотите? Не зная больше о вашем приложении, трудно понять, что предложить.

  • Откуда берутся данные? Файл? Файлы? База данных? Сервисы?
  • Это механизм кеширования? Если да, можете ли вы истечь элементы из кеша, как только они не были доступны какое-то время? Таким образом, вам не нужно держать все в памяти все время.
  • Как другие предположили, если вы просто пытаетесь хранить много данных, можете ли вы просто использовать базу данных? Таким образом, вам не обязательно иметь всю информацию в памяти сразу. При индексировании большинство баз данных отлично справляются с быстрым извлечением. Вы можете объединить этот подход с кешем.
  • Являются ли данные, которые будут в памяти только для чтения, или они должны быть сохранены в какой-либо памяти, когда что-то изменится?
  • Масштабируемость - вы ожидаете, что объем данных, которые будут храниться в этом словаре, со временем увеличится?Если это так, вы столкнетесь с тем, что очень дорого покупать машины, которые могут обрабатывать этот объем данных. Вы можете захотеть посмотреть распределенную систему кеширования, если это так (AppFrabric приходит на ум), поэтому вы можете масштабировать горизонтально (больше машин) вместо вертикальной (одна очень большая дорогая точка отказа).

UPDATE

В свете редактирования плаката, это звучит как кэширование будет идти долгий путь здесь. Существует много способов сделать это:

  • Простой словарный кеширование - просто кеш-файл по мере необходимости.
  • Memcache
  • Caching Application Block Я не большой поклонник этой реализации, но другие добились успеха.
0

Вы можете, но для словаря, как большой, как вы лучше использовать DataBase

1

Пока вы на машине 64GB, да вы должны быть в состоянии использовать этот большой словарь. Однако, если у вас ТАКОЕ много данных, база данных может быть более подходящей (cassandra - это действительно ничего, кроме гигантского словаря, и всегда есть MySQL).

+1

Просто сторона примечания ... приложение необходимо скомпилировать на 64-битный (или любой процессор на 64-битной машине), чтобы процесс занимал более 2 ГБ памяти (я думаю, что это 2 ГБ в любом случае). –

1

Когда вы говорите 1-2 ГБ данных, я предполагаю, что вы имеете в виду объекты - это сложные объекты, которые в совокупности содержат 1-2 ГБ.

Если они не являются структурами (и их не должно быть), словарь не волнует, насколько велики элементы.
Пока у вас меньше, чем около 2 элементов (я вытащил этот номер из шляпы), вы можете хранить столько, сколько сможете поместиться в памяти.

Однако, как и все остальные, вы, вероятно, должны использовать базу данных.
Возможно, вы захотите использовать базу данных в памяти, такую ​​как SQL CE.

0

Используйте базу данных. Убедитесь, что у вас хорошая модель БД, поместите правильные индексы и отпустите.

-2

Вы можете использовать subdictionaries.

Dictionary<KeyA, Dictionary<KeyB .... 

Где KeyA некоторая общая часть KeyB.

Например, если у вас есть String словарь, вы можете использовать первую букву как KeyA.

+0

Как это относится к вопросу? Это похоже на нечеткую схему разбиения кеша и не имеет ничего общего с ответом на то, должен ли пользователь кэшировать результаты из базы данных. – RQDQ

+0

Решает проблему, да, это схема разбиения (проблема со словарями - выделение памяти, когда память заканчивается, она выделяет в два раза больше памяти, а использование схемы разделов может сделать процесс не настолько болезненным), и кажется, что это единственный способ, которым вы хочу иметь действительно большой словарь в ОЗУ (нет в базе данных), конечно, если у вас много RAM, или вы получите OUT OF MEMORY. Также вы можете попробовать переключить свое приложение на 64-битные - возможно, это должно быть первым, что вы должны попробовать ... –

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