Хранение, загрузка и обновление дерева в ASP.NET MVC 3 - PullRequest
2 голосов
/ 02 июня 2011

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

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

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

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

Ответы [ 4 ]

1 голос
/ 04 июня 2011

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

Фактические классы Trie - Вот хороший C # пример классов для настройки Trie .Похоже, вы уже разобрались в этой части.

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

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

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

  • trie.put («Джон», 112);
  • trie.put («Доу», 222);
  • trie.Remove ("Джон");

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

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

1 голос
/ 06 июня 2011

1 Хранить trie в кеше: это не динамические данные, и кеширование помогает нам в других задачах (например, параллельный доступ к trie администратором и пользователем)

2 Обеспечение доступа к кешу:

:

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 Блокировка трехблочного объекта во время добавления операции

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 администратором за раз - сохраните три в xml-файле - оно будетЛегко реализовать логику поискового элемента, после какого слова следует добавить ваше слово (вы можете создать функцию, которая будет использовать объект MyTrie в памяти), и добавить ее, используя linq to xml.

0 голосов
/ 10 июня 2011

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

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

0 голосов
/ 04 июня 2011

У меня такая же, но в 10 раз больше:)

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

Я придумал что-то вроде test и deploy . Администратор вводит значения календаря и устанавливает их правильно, и после того, как он может использовать кнопку Preview , чтобы увидеть, насколько он нуждается / хочет, затем, чтобы сделать изменения действительными для всех конечных пользователей, он должен push Deploy .

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

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

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

...