2013년 4월 11일 목요일

mecab-ko-lucene-analyzer OpenJDK에서 사용하기

mecab-ko-lucene-analyzer가 OpenJDK 상에서는 제대로 동작을 하지 않는 문제가 발견되었습니다. 정확히는 MeCab의 JNI가 비정상적인 동작(형태소 분석 결과가 나오지 않음)을 합니다. MeCab은 Java 인터페이스를 만들기 위해서 SWIG라는 툴을 사용하는데, 이 문제가 SWIG의 문제인지 OpenJDK의 문제인지는 잘 모르겠습니다.

이것저것 시도해보다가 다음과 같이 mecab-java-0.996의 Makefile에서 gcc 최적화 옵션을 -O나 -O1으로 낮추면 정상 동작하는 것을 확인하였습니다. 뭔가 매우 찝찝하지만 일단은 여기까지 입니다. -_-a

테스트 된 환경은 다음과 같습니다.
CentOS 6.3
java version "1.6.0_24"
OpenJDK Runtime Environment (IcedTea6 1.11.1) (rhel-1.45.1.11.1.el6-i386)
OpenJDK Server VM (build 20.0-b12, mixed mode)
관련하여 더 좋은 해결 방법을 아시는 분은 알려주시면 감사 하겠습니다.

TARGET=MeCab
JAVAC=javac
JAVA=java
JAR=jar
CXX=c++
INCLUDE=/usr/lib/jvm/java-6-openjdk/include
PACKAGE=org/chasen/mecab
LIBS=`mecab-config --libs`
INC=`mecab-config --cflags` -I$(INCLUDE) -I$(INCLUDE)/linux
all:
    $(CXX) -O3 -c -fpic $(TARGET)_wrap.cxx  $(INC)
    $(CXX) -O1 -c -fpic $(TARGET)_wrap.cxx  $(INC)
    $(CXX) -shared  $(TARGET)_wrap.o -o lib$(TARGET).so $(LIBS)
    $(JAVAC) $(PACKAGE)/*.java
    $(JAVAC) test.java
    $(JAR) cfv $(TARGET).jar $(PACKAGE)/*.class
test:
    env LD_LIBRARY_PATH=. $(JAVA) test
clean:
    rm -fr *.jar *.o *.so *.class $(PACKAGE)/*.class

cleanall:
    rm -fr $(TARGET).java *.cxx

댓글 2개:

  1. 아 댓글 쓴게 날라갔네요 ㅜㅜ;

    같은 문제로 고생하다가 아래와 같은 정보를 얻어서 공유드립니다.

    "최적화를 통해 사용되는 레지스터는 강제형전환에 의한 C 언어표준규격상 지원하는 않는 방법으로
    메모리에 접근하기 때문에 명확히 알고 사용하지 않는 경우에는 구성에 따라 이런 문제를 발생시킬 수도 있습니다."

    "최적화를 수행하는 옵션에서는 이러한 문제를 확인하기 위해서 strict-aliasing=2 옵션을 함께 사용합니다."

    Mecab.so 파일을 만들 때 gcc 옵션에 strict-aliasing=2 옵션을 추가해서, 에러가 나면 Mecab.so 파일을 만들지 않도록 Make 파일을 수정하는게 좋을 것 같습니다.

    저의 경우 최적화 옵션(O3)를 사용했을 때
    - 로컬에서는 문제가 없었으나,
    - 서버환경에서는 말씀하신 형태소 분석이 실패하고, memcopy 에러가 발생했습니다.

    로컬 환경과 서버 환경의 가장 큰 차이는 libc.so(?) 의 버전 차이로, 서버 환경의 버전이 더 낮았습니다.


    좌표: http://forum.falinux.com/zbxe/?amp;amp;mid=lecture_tip&mid=lecture_tip&page=7&listStyle=webzine&document_srl=560566&sort_index=readed_count&order_type=desc

    답글삭제