bab2min / Kiwi

Kiwi(지능형 한국어 형태소 분석기)
https://lab.bab2min.pe.kr/kiwi
Other
396 stars 46 forks source link

[질문] 스레드 마다 키위를 빌드하여 사용하는 경우 #145

Closed mook1027 closed 5 months ago

mook1027 commented 9 months ago

안녕하세요. 키위를 JNI shared library로 만들어 Java에서 사용하고 있습니다. 애플리케이션 시작 시에 전역 영역에 라이브러리를 로드하고 kiwi_init 과 kiwi_builder_init 의 num_threads 파라미터는 0으로 하여 스레드마다 키위를 빌드하여 사용하려고 합니다. 이렇게 사용하면 되나요? 사이즈가 큰 text analyze를 여러 스레드에서 동시에 호출하거나 할 때 문제가 될만한 사항은 없을까요.

되다 안되다 하는데 다른 문제인지 혹시 문제 가능성이 있는 경우가 있을지 확인하고자 문의드립니다.

감사합니다.

bab2min commented 9 months ago

안녕하세요 @mook1027 , JNI로 C API를 직접 호출하고 계신가보네요. JNI 구현과 그걸 사용하는 java코드가 없어서 명확한 문제 원인 파악은 어렵지만 추측해보자면, 각각의 스레드에서 각자 빌드를 하는 경우 JVM의 특성상 메모리 문제가 발생할 수 있습니다. static으로 Kiwi 인스턴스를 선언하고 싱글스레드에서 이를 초기화 및 빌드하고, 사용만 여러 스레드에서 하는 것이라면 문제가 없습니다.

최근 0.16.0버전부터 공식 Java binding이 지원되오니, 일단 이를 이용해서 동일한 로직을 구현해보시는건 어떨까요? 동일한 문제가 지속된다면 Kiwi의 멀티스레딩 관련 버그로, 아니라면 JNI shared library의 버그로 탐색 범위를 좁힐 수 있을듯합니다.

mook1027 commented 9 months ago

빠른 답변 감사합니다~!