2010-12-01 3 views
1

Мне нужно использовать Stanford Parser в веб-сервисе. Поскольку SentenceParser загружает большой объект, я буду уверен, что это одноэлементный, но в этом случае он является потокобезопасным (нет в соответствии с http://nlp.stanford.edu/software/parser-faq.shtml). Как иначе это будет сделано эффективно? Один из вариантов - блокировка объекта во время его использования.Использование Stanford Parser в веб-сервисе

Любая идея, как люди в Стэнфорде делают это для http://nlp.stanford.edu:8080/parser/?

+0

«большой» он имеет размер от 300 до 600 МБ. – 2010-12-03 20:00:54

ответ

0

Я не знаю, как люди в Стэнфорде внедрили свое обслуживание, но я бы построил такую ​​услугу на основе структуры сообщений, например http://www.rabbitmq.com/. Таким образом, ваш внешний интерфейс будет получать документы и использовать очередь сообщений для связи (хранить документы и получать результаты) с несколькими работниками, которые выполняют синтаксический анализ НЛП. Рабочие - после завершения обработки - будут хранить результаты в очереди, потребляемой передним сервисом. Эта архитектура позволит вам динамически добавлять новых работников в случае высокой нагрузки. Особенно, что теги НЛП занимают несколько секунд на каждый документ.

2

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

Если есть утверждения, я вижу три общих варианта.

(1) инстанцировании это каждый раз

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

(2) с использованием threadlocals

Если конкретизации оказывается дорогостоящим, рассмотреть вопрос об использовании threadlocals. Каждый поток сохранит свою собственную копию синтаксического анализатора, и экземпляр синтаксического анализатора будет повторно использоваться в заданном потоке. Однако Threadlocals не без проблем. Threadlocals может не быть собранным мусором, не будучи установленным в null или пока удерживающая нить не исчезнет. Поэтому есть проблема с памятью, если их слишком много. Во-вторых, остерегайтесь повторного использования. Если эти парсеры являются работоспособными, вам необходимо обеспечить очистку и восстановление исходного состояния, поэтому последующее использование экземпляра threadlocal не страдает от побочного эффекта предыдущего использования.

(3) объединение

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

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