Использование Stanford Parser в веб-сервисе - PullRequest
1 голос
/ 01 декабря 2010

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

Есть идеи, как люди в Стэнфорде делают это за http://nlp.stanford.edu:8080/parser/?

Ответы [ 2 ]

2 голосов
/ 01 декабря 2010

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

Однако, если есть споры, я вижу три основных варианта.

(1) каждый раз создавая его экземпляр

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

(2) с использованием локальных потоков

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

(3) пул

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

0 голосов
/ 01 декабря 2010

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

...