본문 바로가기
python 및 머신러닝

Java에서 python 사용하기

by java개발자 2017. 10. 18.

dwt계산을 지원하는 python library인 PyWavelets을 사용해보자.

> Java에서 PyWavelets(=pywt)을 사용하기


1. using Jython

Jython 을 이용하는 경우 python을 불러올 수 있는데, 

pywt 패키지 내부에 _extensions 폴더의 *.pyd 파일을 불러 올 수 없어서 실패.

2. pywt의 *.pyd 파일을 디컴파일해서 pure python으로 재생성 가능하면, Jython에서 접근 가능.

하지만 속도를 위해 pyd로 만들었는데, 다시 디컴파일한다는 것이 모순됨.

3. Embedding python : c/c++ 에서 python을 사용할 수 있다.

python -> c++ -> dll -> java(JNI) 로 가능한지 테스트

c++에서 Python.h 를 include 하는 부분에서 에러. 보류.

4. c언어로 작성된 libdwt 프로젝트가 있다.

http://www.fit.vutbr.cz/research/view_product.php?id=211&notitle=1

c코드 분석 시간 필요. 보류.

5. using os command

cmd> python test.py [0.378652, ..., 0.184957, 0.1914, 0.23828]

외부 command 창에서 python을 호출하듯이 

Java에서 Runtime.getRuntime().exec(command) 을 이용해서 외부 프로세스를 호출 할 수 있다.

단, 위의 command와 같이 배열 4096개의 값을 string으로 나열해서 전달할 수는 있지만 길이 초과 문제 때문에 에러가 발생한다. 크기가 큰 배열을 전달 할 수 없다.

아예, python 내부에서 raw 파일을 읽어서 dwt처리까지 한 다음에 데이터를 print하면

Java에서 파싱해서 배열로 재생성 한다.

단점: 시간이 오래 걸린다.

python에서 raw 파일을 1개씩 읽고, dwt 처리 후 java로 전달 : 

20개파일 * 3방향 * 4클래스 exec 이용하면 89초 소요

python에서 raw 파일을 20개씩 읽고, dwt 처리 후 java로 전달 :

3방향 * 4클래스 exec 이용하면 14초 소요

6. py4j : python -> java로만 통신이 가능하다.(java -> python 불가)

7. jcc : python -> java

8. jep : java -> python 통신 가능. 

python 별도 서버구성 필요 없음.

단 cmd>pip install jep 할때, visual c++ build tools 미리 설치 필요(windows7)

java main 실행시, 추가설정 :

-Djava.library.path='C':\ProgramData\Anaconda3\Lib\site-packages\jep

4클래스 (4회통신) 으로 5초 소요

(jep와 python과의 통신 비용을 줄이기 위해, 

1회 통신시 python 내에서 (20개 파일 * 3방향) 파일의 파싱을 처리한다.

장점 : command로 할 때는 데이터를 전부 String으로 송수신하였는데, 

jep를 이용시 객체로 송수신 가능하다.

단점 : 1 Thread 하에서 작동이 가능하다. 다른 이름의 Thread(Spring...)하에서는 Jep인스턴스를 새로 생성해야 하는데, 

이러한 Thread 관련 Util이 개발되어 있지 않아서, 추후 멀티사용자 관련해서 문제가 될 수 있다. 

- 시스템 안정성 (jep로 인해 tomcat이 fatal error로 shutdown 되는 문제)

9. pyro4 vs jep

pyro4는 python server를 독립적으로 띄워서 python과 통신하는 방식.

20 files * 3방향 * 5복제(DWT) * 4096데이터

> pyro4 : 10초, jep : 1초

  > 성능이슈



'python 및 머신러닝' 카테고리의 다른 글

ipython notebook theme 변경  (0) 2017.10.10