как использовать stanford parser с потоками - PullRequest
0 голосов
/ 11 февраля 2011

Привет! Я хочу использовать stanford parser с потоками, но я не знаю, как это сделать с помощью пула потоков.Я хочу, чтобы все потоки делали это:

LexicalizedParser.apply (Object in)

, но я не хочу все время создавать новый объект LexicalizedParser, потому что он будет загружать lp = new LexicalizedParser ("englishPCFG.ser.gz");и это займет 2 секунды для каждого объекта.что я могу сделать?

спасибо!

Ответы [ 2 ]

2 голосов
/ 13 января 2012

Думаю, уже слишком поздно, но есть версия с защитой потоков: http://nlp.stanford.edu/software/lex-parser.shtml

1 голос
/ 13 июля 2011

Вы можете использовать ThreadLocal .Это позволяет вам сохранить один экземпляр анализатора на поток.Таким образом, любой созданный экземпляр парсера никогда не будет использоваться из более чем одного потока.

Обычно он не должен создавать больше экземпляров, чем у процессоров * ядер, которые у вас есть.

Для меня это ~ 4-5 экземпляров (если я отключу Hyper Threading на моем четырехъядерном процессоре).


PS Не относится к StanfordNLP. Иногда реализации плохих классов содержат статические поля и модифицируют их без поточно-ориентированного способа.Общий подход безопасного распараллеливания для таких реализаций будет следующим:

  1. перемещение вычислительной части в отдельный процесс ;
  2. запуск (ЦП * ядер) числа процессов с вычислениями.
  3. использование IPC для связи между основными / фоновыми процессами.
...