2017-02-08 19 views
2

Проблемы:проблем с памятью, в то время как с помощью UIMA Ruta

Я использую UIMA Руту (V2.3.1) в одном из моих проектов, но теперь я столкнулся с проблемой: память превышает объяснима размеров, но не может быть выяснено, где эта проблема находится, за исключением класса org.apache.uima.ruta.rule.RuleElementMatch, который занимает до 50% использования памяти.

Я вызываю JavaAPI UIMA Ruta в своем проекте, чтобы настроить механизм анализа. Когда я отправляю текст для анализа размером около 400 кбайт для этого движка, вокруг этого процесса блокируется около 700 МБ памяти, но без каких-либо шансов для GC освободить некоторое пространство.

Ruta проект:

Данные правила Ruta встроены с REGEXP-структурами, но теоретические они должны уменьшить количество используемой памяти, потому что есть UNMARKALL-заявления на конкретных конечных точках.

Кто-то сталкивается с такой же ситуацией с высокой потребляемой памятью или есть какие-либо предлагаемые решения? Использование профиля низкой памяти в качестве рекомендации самой uima невозможно, поскольку время отклика уже составляет около 30 секунд. Увеличение максимальной памяти JVM не является вариантом.

+0

Какая часть API Java вы используете? –

+0

Что вы подразумеваете под REGEXP-структурами? Состояние REGEXP или простые правила регулярного выражения? Какими правилами являются действия UNAMRKALL? Что вы подразумеваете под конечной точкой? –

+0

Как я должен понимать вопрос для JavaAPI? Мы создаем AnalysisEngine, как описано в документации для этого API, добавляя все необходимые типы систем и нажимаем текст для анализа с этим движком с помощью метода process. REGEX-Структуры находятся в условной части нашего составленного правила, как показано в следующем примере: ** (ЛЮБОЙ {REGEXP ("(H | h) ello")} ЛЮБОЙ {REGEXP ("(Mr | Mrs .) ")}) {NOT (IS (Приветствия)) -> MARK (Приветствия)} ** –

ответ

0

Возможно, это не ответ, но вот некоторые комментарии, которые могут помочь.

Как указано в названии, RutaRuleElementMatch хранит совпадения элементов правил, которые требуются с одним RuleMatch, чтобы идентифицировать информацию для действий. Эта информация может быть забыта после RuleMatch, но иногда ее необходимо сохранить. В основном, он сохраняется, если движок анализа настроен для отладки (параметры debug и debugWithMacthes). Затем все совпадения правил и совпадения элементов правила запоминаются для создания аннотаций отладки позже. Если есть много совпадений, это может занять много памяти в текущей реализации.

Конфигурация отладки также используется в Java API, например, в Ruta.select() или Ruta.matches(). В меньшем количестве совпадения также запоминаются для основных правил операторов блоков.

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

400KB текста довольно много, я думаю. Ruta приносит довольно некоторые издержки, что требуется, но также может быть улучшено/уменьшено. Прямо сейчас, до тех пор, пока реализация не будет улучшена, есть несколько лучших практик для обработки большого документа в руте, т. Е. Уменьшения использования памяти.

В вашем случае использования я бы переключился на другую сеялку, которая создает только нужные вам аннотации, и только там, где они вам нужны, например, вам нужно пространство и перерыв? Тогда я бы реорганизовал правила. Правило примера, указанное в комментариях, крайне неэффективно и создает много RuleElementMatches. Я скорее рекомендую использовать словарь, где это возможно, например. с TRIE. Вы также можете улучшить такое правило, ограничив условие соответствия. В вашем примере это может быть W или результат поиска в словаре.

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

Если профилирование показывает, что RutaBasic использует большую часть памяти, то это обусловлено размером документа и, следовательно, количеством аннотаций. Уменьшение количества аннотаций помогает, так как меньше информации о покрытии необходимо хранить во внутренних списках/массивах. UNMARK и UNMARKALL помогают также, но не дольше, как ожидается, по крайней мере, в моих случаях использования. Существует также параметр lowMemoryProfile, который уменьшает использование памяти RutaBasic, а также производительность во время выполнения, как вы упомянули. Тем не менее, я полагаю, что ваши правила могут быть оптимизированы очень сильно, так что параметр снова будет вариантом.

Надеюсь, это поможет.

ОТКАЗ: Я разработчик UIMA Ruta

+0

Спасибо за этот ответ, мы смотрим, как мы можем преобразовать эти советы в изменения в проекте ruta. На самом деле, мы сталкиваемся с множеством массивов arraylist в наших heapdumps, некоторых неэффективных правилах, которые мы преобразуем, но у них все еще есть пики памяти около 600 м, поэтому мы ищем другое решение. Одним очевидным случаем был билет, который мы создали, но это не единственный, где генерируются большие пустые массивы. Класс CASImpl генерирует несколько куч с твердым размером, что является еще одним моментом для улучшения производительности памяти. –

+0

Вы также можете разделить документы и обработать детали отдельно/последовательно. Но вы, вероятно, знаете это, и это часто не вариант. –

+0

Уменьшение количества аннотаций RutaBasic может быть хорошим вариантом для вас. Вам действительно нужны аннотации TokenSeed? –

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

  • Нет связанных вопросов^_^