2013-04-27 4 views
2

У меня есть эта функция, чтобы прочитать файл DOC с помощью TIKA на Linux:не смог выполнить команду Java от CGI

def read_doc(doc_path): 
    output_path=doc_path+'.txt' 
    java_path='/home/jdk1.7.0_17/jre/bin/' 
    environ = os.environ.copy() 
    environ['JAVA_HOME'] =java_path 
    environ['PATH'] =java_path 
    tika_path=java_path+'tika-app-1.3.jar' 
    shell_command='java -jar %s --text --encoding=utf-8 "%s" >"%s"'%(tika_path,doc_path,output_path) 
    proc=subprocess.Popen(shell_command,shell=True, env=environ,cwd=java_path) 
    proc.wait() 

Эта функция отлично работает, когда я запускаю его из командной строки, но когда я называю тот же функция с помощью CGI, я получаю следующее сообщение об ошибке:

Error occurred during initialization of VM Could not reserve enough space for object heap

Я проверил предыдущие ответы для этой конкретной ошибки, и они предполагают увеличение памяти, но это не похоже на работу ... Я не думаю, что это имеет делать с распределением памяти, а скорее некоторые чтения/записи/выполнения privilages из скрипта cgi, любая идея ho w решить эту проблему?

+0

Не было бы лучше работать с сервером Tika, так что есть только одна стоимость запуска и наличие python для передачи данных Tika для обработки? – Gagravarr

+0

Спасибо, выглядит неплохо, мне удалось запустить сервер, но не знаю, как его использовать ... – hmghaly

+0

В документе [Tika Wiki] задокументировано (Tika Wiki) (http: //wiki.apache. org/tika/TikaJAXRS) – Gagravarr

ответ

3

Вы нагружать весь экземпляр виртуальной машины Java в пространстве процесса каждого отдельного CGI вызова памяти &. Плохо. Очень плохо. Для производительности и использования памяти. Увеличение распределения памяти - это взлом, который не решает реальной проблемы. Код ядра Java почти никогда не должен вызываться через CGI.

Вы бы лучше:

  • избежать как CGI и Python, запустив сервлетов Java в вашем веб-сервере, который вызывает соответствующий класс Тика непосредственно с желаемыми аргументами. Сопоставьте URL-адрес пользователя непосредственно с сервлетом (через аннотацию @WebServlet («someURL») в классе Servlet).
  • Running Tika in server mode и вызов его через REST из Python.
  • Запуск приложения Java-ядра отдельно в процессе обработки сервера/демона, прослушать его на сервере TCP Server. Вызовите из Python через клиентский сокет.
+0

Выглядит неплохо, я думаю, что работает tika в режиме сервера лучше всего, и я смог запустить его, но я не могу использовать netcat для выполнения следующей команды (у меня нет доступа root для установки netcat): nc 127.0 .0.1 12345 hmghaly

-1

Попробуйте добавить -Xmx512m и -XX:MaxHeapSize=256m в команду shell. Так что команда оболочки выглядит так.

shell_command = 'java -XX:MaxHeapSize=256m -Xmx512m -jar %s --text --encoding=utf-8 "%s" >"%s"'%(tika_path,doc_path,output_path)

+0

'XX: MaxHeapSize' и' Xmx' control То же самое, вы можете использовать только один из них. –

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