2011-06-01 4 views
2

У меня есть алгоритм определения слов на основе trie для пользовательского словаря. Обратите внимание, что регулярные выражения слишком хрупкие с этим словарем, поскольку записи могут содержать пробелы, периоды и т. Д.Сохранение, загрузка и обновление Trie в ASP.NET MVC 3

Я реализовал алгоритм в локальном приложении C#, который читает в словаре из файла и хранит trie в памяти (это компактный, поэтому проблем с размером ОЗУ вообще нет). Теперь я хотел бы использовать этот алгоритм в приложении MVC 3 на облачном узле, таком как AppHarbor, с добавленным твистом, который я хочу, чтобы веб-интерфейс позволял добавлять/редактировать слова.

Это достаточно быстро, что загрузка словаря из файла и построение trie каждый раз, когда пользователь загружает их текст, не будет проблемой (< 1s на моем ноутбуке). Однако, если я хочу, чтобы администраторы могли редактировать словарь через веб-интерфейс, это выглядело бы сложно, поскольку словарь мог бы обновляться, когда пользователь пытается загрузить текст для анализа.

Какова наилучшая стратегия для хранения, загрузки и обновления trie в приложении MVC 3?

ответ

1

Я не уверен, что вы ищете конкретные детали реализации, или более концептуальные идеи о том, как обращаться, но я покажу некоторые идеи там.

Актуальные категории: - Хороший C# example of classes for setting up a Trie. Похоже, вы уже поняли эту часть.

Хранение: Я бы сохранял данные trie в XML, если вы уже не используете базу данных и не должны иметь ее в dbms. XML будет прост в работе с MVC-приложением, и вам не нужно беспокоиться о проблемах с подключением к базе данных или добавленной стоимости базы данных. У меня также есть две версии данных trie на сервере, производственная копия и копия поддержки производства, вторая, для которой ваш администратор может выполнять транзакции.

Загрузка В вашем админ-модуле приложения вы можете реализовать функцию загрузки данных trie в память, частота загрузки данных зависит от ваших потребностей приложения.Он может быть запланирован или доступен как ручная функция. Как и на сайтах Wordpress, если пользователь должен получить к нему доступ во время обновления, они получат сообщение о том, что сайт проходит техническое обслуживание. Вы можете загружать только в память по требованию и всегда сохранять загруженные файлы, за исключением случаев, когда возникли проблемы.

Обновление - У меня будет вторая база данных (или XML-файл), которая используется для применения обновлений. Метод применения обновлений к производству будет зависеть частично от частоты, количества и времени обновлений. Один безопасный метод может заключаться в том, чтобы хранить транзакции, введенные администратором. Например:

  • trie.put ("John", 112);
  • trie.put ("Doe", 222);
  • trie.Remove ("John");

Затем примените эти транзакции к вашим производственным данным по мере необходимости через функцию администратора. При необходимости переведите свой сайт в режим «maint». Если обновлений мало и быстро, вы можете закодировать сайт так, чтобы он выполнял всю работу до тех пор, пока транзакции не будут обработаны, пользователю может потребоваться дольше нескольких миллисекунд для результата, но вам не придется беспокоиться о мутировании данных.

Это довольно расплывчато, но просто бросает некоторые идеи ... если вы дадите комментарии, я постараюсь дать больше.

+0

Ну, спасибо, Уэсли, моя первая щедрость, поэтому ты сделал мой день. Надеюсь, что я несколько помог, я уверен, что вы надеялись получить более подробную информацию. Удачи в проекте. :) –

0

Я получил kind'a то же самое, но в 10 раз больше :)

Конструкция клиента это собственный календарь с вопросами анс возможный ответ тем временем некоторые находится в оперативном режиме и используется нормальным пользователем.

Что я придумал, было как-то тест и развернуть. Администратор вводит значения календаря и правильно настроил их, и после того, как он сможет использовать кнопку Preview, чтобы узнать, нравится ли это ему или хочет, чтобы изменения были действительны для всех конечных пользователей, ему нужно нажать Развернуть ,

Он, как ADMIN, будет знать, что до тех пор, пока он не нажмет кнопку DEPLOY, все пользователи, получающие доступ к Календарю, будут иметь старые значения. Вскоре он ударил все, установленное в базе данных, и нажал файлы, которые он загрузил на Amazon S3 (для более быстрого доступа).

Я обновляю Кэш с новым календарем, и новый объект Calendar кэшируется до тех пор, пока пул приложений не говорит иначе, или он снова нажал кнопку «Развернуть».

Вы могли бы сделать что-то вроде этого.

1

1 Магазин Trie в кэше: Это не динамические данные, и кэширование помогает нам в других задачах (например, доступ параллелизма к синтаксическому дереву с помощью администратора и пользователя) доступом

2 Make кэшировать ясный:

:

public class TrieHelper 
{ 
public Trie MyTrie 
{ 
    get 
    { 
     if (HttpContext.Current.Cache["myTrieKey"] == null) 
      HttpContext.Current.Cache["myTrieKey"] = LoadTrieFromFile(); //Returns Trie object 
     return (Trie)HttpContext.Current.Cache["myTrieKey"]; 
    } 
} 

3 Блокировка объекта Trie при добавлении операции в ходе

public void AddWordToTrie(string word) 
{ 
    var trie = MyTrie; 
    lock (HttpContext.Current.Cache["myTrieKey"]) 
    { 
    trie.AddWord(word); 
    } // notify that trie object locking when write data to file is not reuired 
    WriteNewWordToTrieFile(word); // should lock FileWriter object 
    } 
} 

4 Если редактирование выполняется 1 администратором за один раз - храните trie в xml-файле - будет легко реализовать логику элемента поиска, после чего слово ваше слово должно быть добавлено (вы можете создать функцию, которая будет использовать объект MyTrie в памяти) и добавьте его, используя linq в xml.

0

Как вы собираетесь выполнять свое приложение в облачной среде, я бы предложил вам взглянуть на CQRS и надежный обмен сообщениями и предоставить некоторую модель параллелизма (возможно, оптимистичный параллелизм и интеллектуальное обнаружение конфликтов http://skillsmatter.com/podcast/design-architecture/cqrs-not-just-for-server-systems 5:00)

Кроме того, очевидно, что вам необходимо более точно проанализировать ваши бизнес-требования, поскольку, как Udi Dahan mentioned, условия гонки являются результатом отсутствия анализа бизнеса.

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