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¬itle=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 |
---|