В нашем настольном приложении мы реализовали простую поисковую систему с использованием инвертированного индекса.
К сожалению, некоторые наборы данных наших пользователей могут стать очень большими, например занимает ~ 1 ГБ памяти до создания инвертированного индекса. Сам инвертированный индекс занимает много памяти, почти столько же, сколько индексируемые данные (еще 1 ГБ ОЗУ).
Очевидно, что это создает проблемы с ошибками нехватки памяти, поскольку 32-разрядный лимит Windows в 2 ГБ памяти на приложение исчерпан, или пользователи с компьютерами с меньшими характеристиками изо всех сил пытаются справиться с потребностями в памяти.
Наш инвертированный индекс хранится как:
Dictionary<string, List<ApplicationObject>>
И это создается во время загрузки данных, когда каждый объект обрабатывается таким образом, что строка ключа applicationObject и слова описания сохраняются в инвертированном индексе.
Итак, мой вопрос: можно ли хранить поисковый индекс более эффективно с точки зрения пространства? Возможно, необходимо использовать другую структуру или стратегию? Как вариант, можно ли создать своего рода CompressedDictionary? Поскольку он хранит много строк, я ожидал, что он будет очень сжимаемым.