Вызов через командную строку по сравнению с JNI

Мне нужно вызвать tesseract OCR (это библиотека с открытым исходным кодом на C++, которая выполняет оптическое распознавание символов) с сервера приложений Java. Прямо сейчас достаточно просто запустить исполняемый файл с помощью Runtime.exec(). Основная логика будет

  1. Сохранить изображение, которое в данный момент хранится в памяти, в файл (.tif)
  2. передать имя файла изображения в программу командной строки tesseract.
  3. прочитать выходной текстовый файл из Java с помощью FileReader.

Насколько я могу улучшить производительность, написав оболочку JNI для Tesseract? К сожалению, нет JNI-оболочки с открытым исходным кодом, которая работала бы в Linux. Мне пришлось бы сделать это самому, и мне интересно, стоит ли выгода затрат на разработку.


person Ish    schedule 23.01.2009    source источник
comment
Не могли бы вы вставить команду, которую вы использовали в Runtime.exec() для запуска команды tesseract. не могу разобрать...   -  person jorgen    schedule 13.10.2011


Ответы (3)


Трудно сказать, стоило ли оно того. Если вы предполагаете, что если это делается в процессе через JNI, код OCR может напрямую обращаться к данным изображения без необходимости записывать их в файл, то это, безусловно, устранит любые ограничения дискового ввода-вывода.

Я бы рекомендовал использовать более простой подход и использовать вариант JNI только в том случае, если производительность неприемлема. По крайней мере, тогда вы сможете провести сравнительный анализ и оценить прирост производительности, который вы могли бы реализовать.

person Mark Renouf    schedule 23.01.2009

Если вы хотите создать собственную оболочку, я рекомендую вам проверить JNA. Это позволит вам вызывать большинство «родных» библиотек, пишущих только код Java, и даст вам больше помощи, чем необработанный JNI, чтобы сделать это безопасно. JNA доступен для большинства платформ.

person erickson    schedule 23.01.2009
comment
Спасибо за совет, я не слышал о JNA. Я рассмотрю его для любых будущих проектов, требующих встроенной привязки. - person Ish; 23.01.2009
comment
Две другие библиотеки сопоставления (JInvoke и Swig) упоминаются здесь: jni">stackoverflow.com/questions/1172486/есть-есть-рынок-для-jni - person dma_k; 12.04.2010
comment
JNA не очень хорошо работает с C++, а скорее с C, и Tesserect мигрировал (в основном) на C++. - person Hovercraft Full Of Eels; 14.09.2011
comment
@Hovercraft - это отличный момент, который я не учел в этом случае. JNA очень удобна, но не для каждого приложения. - person erickson; 14.09.2011

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

person okutane    schedule 23.01.2009