Сохранение файла на диск - PullRequest
1 голос
/ 20 сентября 2010

Звучит как простой вопрос, но я не знаю, как найти его ответ.

У меня есть три реализация C #, которая будет хранить около 80 тыс. Слов из файла словаря. Загрузка всех этих слов занимает много времени (более 5 минут). Мне было интересно, как лучше "сохранить" эти данные, чтобы мне не приходилось перезагружать все слова каждый раз, когда я запускаю приложение?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 20 сентября 2010

Как и все другие проблемы с производительностью, идеальное решение будет следовать из профилирования вашего текущего решения и других возможных решений, которые вы придумали.Где узкое место?Ввод / вывод?Лексировать текст?Формирование ссылок в три?Будет трудно сделать предложение конкретное , не зная ваших целей производительности, характера использования трия и узких мест в настоящее время.

Вопросы для рассмотрения:

  1. Формат хранения: текст?Двоичные?
  2. Сохраняемые данные: вся структура дерева (например, в виде XML) или просто список слов, полагаясь на код времени выполнения, чтобы поместить их в нужное место в структуре данных?Каково соотношение разметки к данным?Насколько тяжело это анализировать?
  3. Место хранения: БД / плоский файл / ...?
  4. Инкрементная загрузка: возможно?

Одна из возможных стратегий:Создайте и сохраните словарь «наиболее распространенных слов» с 1000 (или около того) наиболее часто используемых слов.Загрузите эти слова в три при запуске и породите загрузку полного словаря в другом потоке;постепенно добавляя к созданному дереву по мере чтения новых слов.

  • Плюсы: пользователь увидит более быстрое время запуска.
  • Минусы: может потребоваться синхронизация между потоками, пользователь увидит незавершенный файл до полной загрузки.Это может или не может быть showtopper в зависимости от того, для чего используется три.
2 голосов
/ 20 сентября 2010

Я недавно провел рефакторинг аналогичной структуры данных из-за низкой производительности и медленного времени сериализации / десериализации.

Мое решение состояло в том, чтобы полностью отказаться от этого и использовать нативные коллекции .NET - словари и справочники.

Я работаю с примерно 400 тыс. Слов. Из памяти требуется около 5 секунд для построения структуры данных, которая представляет собой список объектов, проиндексированных рядом словарей и поисков.

  • Верхний уровень структуры Dictionary<int, var> где ключ is n - количество букв в искать термин.
  • Каждое значение в словарь является Lookup<string, string>, где ключ является строкой с n букв, и значение все строки, которые начинаются с этой строки. например, для ключа значения 'st' могут быть 'start', 'stop' и 'string'.

Чтобы создать структуру данных, я просто перебираю весь список слов для i = 1 до maxlength, чтобы создать Lookup для всех отдельных строк «начинается с» для каждого i. Включите их в словарь верхнего уровня, и все готово.

Это устраняет необходимость в пользовательском трие. Я обнаружил, что разница в производительности (время поиска) незначительна, но скорость загрузки чрезвычайно благоприятствует моему дизайну (не говоря уже о простоте и удобстве использования простых типов .NET).

0 голосов
/ 20 сентября 2010

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

То есть для сериализацииузел дерева, вы делаете это:

Read/Write number N of subnodes
For each subnode
  If reading, allocate a subnode in this node
  Read/Write the character for the subnode
  Serialize the subnode
End

Изменить: Просто перечитайте свой вопрос, и вы хотите построить дерево с нуля из списка слов?Как говорили другие, профиль, но не только с любым старым профилировщиком.Они не все находят твою проблему. Вот что я делаю. Время, которое требуется, не должно быть намного больше, чем время, необходимое для чтения файла, плюс время, необходимое для создания структуры.

...