Ограничить процессор/стек для вызова метода Java?

StackOverflow https://stackoverflow.com/questions/1081466

  •  22-08-2019
  •  | 
  •  

Вопрос

Я использую библиотеку NLP (Stanford NER), которая выдает ошибки OOM для редких входных документов.

Я планирую в конечном итоге изолировать эти документы и выяснить, что в них вызывает ошибки, но это сложно сделать (я работаю в Hadoop, поэтому я просто знаю, что ошибка возникает в 17% случаев при разделении 379/500 или что-то в этом роде) .В качестве временного решения я хотел бы иметь возможность применять ограничение ЦП и памяти к этому конкретному вызову.

Я не уверен, как лучше всего это сделать.Моя первая задача — создать фиксированный пул потоков из одного потока и использовать timed get() в Future.Это, по крайней мере, дало бы мне ограничение на настенные часы, что, вероятно, несколько помогло бы.

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

Это было полезно?

Решение

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

(Это одна из стратегий, которую я использую со Стэнфордским анализатором зависимостей, чтобы перейти к следующему предложению, если одно предложение слишком длинное или запутанное для анализа.)

Другие советы

Я не знаком с Hadoop, но не забывайте, что для вашей JVM будет неявно наложена верхняя граница памяти (64 МБ для сервера, если мне не изменяет память).Я бы проверил, с какой конфигурацией памяти работает ваша JVM (опции здесь)

Вы можете переопределить это, указав верхний предел памяти следующим образом:

java -Xmx512m

(скажем) установить ограничение на 512 МБ.

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

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

Если все, что вы пытаетесь сделать, это выяснить, какие документы дают сбой, вам следует организовать журналирование вызова библиотеки NLP «сопоставление документа x».Когда вы увидите OOM, журналы картографа будут содержать документ гибели.Как вы сказали, затем вам следует определить, какие характеристики этого документа приводят к сбою библиотеки.

По моему опыту, особенно если документы были созданы людьми в Интернете, где-нибудь вы найдете какой-нибудь безумно огромный документ.На этом этапе вам нужно решить, что делать с такими документами;либо игнорировать их, возможно, обрезать их.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top