Как накатить свой индекс в c #? - PullRequest
1 голос
/ 03 июня 2010

Мне нужен более быстрый способ создания индексного файла. Приложение генерирует пары элементов для индексации. В настоящее время я добавляю каждую пару, поскольку она генерируется в отсортированный словарь, а затем записываю ее в файл на диске. Это работает хорошо до тех пор, пока количество добавленных предметов не превысит миллион, и в этот момент оно замедляется до уровня, который является недопустимым. Может быть проиндексировано до трех миллионов элементов данных. Я предпочитаю избегать базы данных, потому что я не хочу значительно увеличивать размер пакета развертывания, который сейчас составляет менее половины одного мегабайта. Я попробовал Access, но он даже медленнее, чем отсортированный словарь - если у него была эффективная утилита массовой загрузки, которая могла бы работать, но я не нахожу такого инструмента для Access.

Есть ли лучший способ прокрутить мой собственный индекс?

Ответы [ 3 ]

6 голосов
/ 03 июня 2010

Является ли SortedDictionary узким местом? По сравнению с I / O?
Вы действительно должны профилировать это в первую очередь, чтобы избежать оптимизации неправильных частей.

Но в качестве подсказки, если у вас есть 1 МБ или более элементов, рекомендуется заранее выделить словарь. Дайте ему начальную емкость 2M или около того.

//var index = new SortedDictionary(2 * 1024 * 1024);  // not supported, it's a tree
var index = new SortedList(2 * 1024 * 1024);

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

1 голос
/ 03 июня 2010

Просто мысль, а не могли бы вы использовать решение SQL в памяти, такое как SQL Lite? Это просто небольшая DLL, но она поможет вашим приоритетам, вашей логике в C # и вашей сортировке в SQL.

Посмотрите здесь:

http://web.archive.org/web/20100208133236/http://www.mikeduncan.com/sqlite-on-dotnet-in-3-mins/

Сама загрузка для SQL Lite составляет всего 253 КБ, а привязки .net - около 75 КБ.

0 голосов
/ 03 июня 2010

SQLite слишком велик для развертывания с вашим программным обеспечением? Я согласен с Хенком, что постоянное перераспределение в SortedDictionary, вероятно, является узким местом. Если это решение окажется ложным, попробуйте использовать SQLite, чтобы посмотреть, не увеличивает ли это производительность, а затем вы можете решить, куда идти дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...