2009-07-04 9 views
1

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

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

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

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

ответ

1

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

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

2

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

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

java -Xmx512m 

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

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

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

0

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

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