본문 바로가기

IT-Consultant

다중파일 vs 복합파일 K2로 색인을 만들면 6만 5천개 단위로 segment를 만들게 된다. 이 숫자는 정해져 있기 때문에 바꿀수는 없다. Lucene의 경우 사용자가 지정한 수치에 따라서 segment가 만들어진다. K2와 Lucene 모두 데이터가 늘어나면 색인 파일 갯수도 비례해서 늘어나게 된다. 만약 6억건의 데이터라면 어떻게 될까? K2는 1만개의 파일을 열어야지 검색할 수 있다. 파일 오픈하는데 소요되는 비용이 검색비용보다 더 클수도 있다. 이런 문제를 Lucene에서는 복합파일구조로 해결했다. 논리적으로 기존과 같은 구조이지만 모든 파티션 파일을 하나에 넣는 것이다. 이런 방식이 효율적일 것 같다. 기본적으로 복합파일 구조이나 만약 다중파일구조를 쓰고 싶다면 소스코드에 setUseCompoundFile(false.. 더보기
점점 더 Lucene이 좋아진다. 문제 발생시 소스가 있다는 것이 얼마나 행복한것인지 모르겠다. 특히 C로 만든 프로그램의 경우 소스가 없고 실행파일에 디버깅정보도 없다면 사실 디버깅이 안된다고 볼 수 있다. 사소한 문제가 생겨도 개발자에게 의존을 해야하고 내 맘대로 바꿀수도 없는게 정말 짜증났다. 그런데 루씬은 모든걸 내 맘대로 바꿀 수 있어서 좋다. 아직 핵심부분을 내 맘대로 바꿀수 있는 능력이 되지 않지만 1년후에는 모든 소스를 내 맘대로 쭈물럭꺼릴 수 있을 것 같다. 1년 너무 긴거 아냐.. 더보기
RAMDirectory 얼마나 효과적인가? 10만개의 파일을 Default 셋팅으로 색인하면 10분걸리는데 RAMDirectory를 사용하면 5분 걸린다. 생각보다 빨리 끝나지 않는다. 10분중에서 줄어든 부분은 5분이다. 이 부분은 색인시 merge할때 그리고 색인된 결과를 저장할때 소요되는 시간이다. 그럼 나머지 5분은 원본 파일을 읽어들이고 bigram으로 키워드 분리하고 소팅하는 시간이다. 이렇게 보면 시간이 많이 단축되었다고 볼 수 있다. 더보기
Lucene에서 사용하는 quickSort 코드 어려운 알고리즘은 아니지만 성능도 좋고 많이 사용되는 알고리즘이다. 간단히 설명하면 전체 데이터를 반으로 뚝 짤라서 중간값보다 작은 것은 왼쪽에 두고 큰것은 오른쪽에 둔다. 같은 방식으로 계속 짤라 나가다보면 모든 데이터가 정렬된다. 그런데 왜 아래의 수식이 나오는 것일까? 2N ln N private static final void quickSort(Posting[] postings, int lo, int hi) { if (lo >= hi) return; int mid = (lo + hi) / 2; if (postings[lo].term.compareTo(postings[mid].term) > 0) { Posting tmp = postings[lo]; postings[lo] = postings[mid].. 더보기
NAS 장비를 사용하여 이중화할 경우 무엇이 문제인가? 여기서 이중화는 Active-Active일 경우이다. 2대 이상의 서버에서 하나의 스토리지를 공유해서 검색 서비스를 할 경우 무엇이 문제가 될수 있는가? 한대의 서버에서만 색인하고 다른 서버에서는 검색할 경우 문제가 발생할까? 이 상황에서 발생할 수 있는 일들에 대해서 생각해보자. 1. OS에서 데이터를 Write하는 원리 OS에서 데이터를 디스크에 쓸때 바로 디스크로 데이터가 가는 것이 아니라 중간에 메모리에 쌓였다가 디스크로 보내진다. 그래서 갑작스런 시스템 종료로 파일이 깨질 수 있다. 2. A,B 두대의 장비가 같은 디스크를 NFS로 공유할 경우 A 장비에서 Write한 데이터가 B 장비에서 인식하는 과정을 생각해보자. A장비의 메모리 - A장비의 버퍼 - NAS 장비의 Write Cache - .. 더보기
sar 결과 분석 $ sar -u 1 HP-UX lucky B.11.11 U 9000/800 10/22/06 22:31:28 %usr %sys %wio %idle 22:31:29 0 0 1 99 %usr : user call %sys : system call %wio : IO 병목현상으로 CPU가 대기하고 있는 비율 (통상 10%이상이면 문제가 있는 것으로 본다.) $ sar -b 1 HP-UX lucky B.11.11 U 9000/800 10/22/06 22:32:37 bread/s lread/s %rcache bwrit/s lwrit/s %wcache pread/s pwrit/s 22:32:38 0 41 100 0 1 100 0 0 $rcache : Cache Hit rate(통상 80%이상이면 문제가 있는것으로 본다.) 더보기
vmstat 결과 분석 원론적인 이야기는 생략하자. 직관적으로 생각할 수 있게 정리한다. procs memory page faults cpu r b w avm free re at pi po fr de sr in sy cs us sy id 2 5 0 3044320 67760 0 0 0 0 0 0 0 9260 50534 5935 29 13 58 r : CPU 병목현상(숫자는 대기하는 프로세스 수) b : DISK IO 병목현상(숫자는 대기하는 프로세스 수) w : MEM 부족현상(커널파라미터 조정 또는 메모리 증설 필요) cs : 숫자가 크면 쓰레스 수가 너무 많다는 것이다. us : 어플리케이션 병목현상 sy : 시스템 자원(주로 Disk IO) 병목현상 id : 숫자가 크면 CPU가 논다. vmstat 예제(영문) 성능 200.. 더보기
bigram analyzer 구현 현재 형태소 분석기를 만드는 것보다 루씬을 공부하는게 더 큰 의미가 있기 때문에 우선 bigram analyzer를 구현해서 작은 사이트를 만든후 나중에 analyzer만 교체하도록 한다. 구현할려고 책좀 착아보니 이미 CJK analyzer에서 구현되어 있더군. 그럼 바로 브리태니커 백과사전을 검색할 수 있도록 만들어 봐야 겠다. 더보기
형태소 분석 기법 1. 형태소 분석 방향 좌우 분석법, 우좌 분석법, 양방향 분석법, 역방향 분석법 2. 형태소 인식 방법 최장일치법, 최단일치법, Tabular Parsing(CKY)방법 3. 형태소 분리 방법 Heal-Tail 구분법, 음절 단위 분석법 4. 형태소 결합조건 기술 접속정보표를 이용, 결합제약 규칙에 의한 방법 5. 불규칙 어절의 원형 복원법 Two-level 형태론, 음절 기반 형태론 -- 장,단점 -- 1. Head-Tail 구분법 가장 간단하면서도 비교적 높은 품질이 나올 수 있다. 2. 어절 네트웍크를 이용한 분석기 품사체계 변경, 규칙의 확장 등이 곤란하기 떄문에 내가 사용하기엔 좀 문제가 있다. 3. Tabular Parsing 법 단어의 모든 문자열에 대하여 사전 탐색을 해야하기 때문에 속도.. 더보기
형태소 분석기를 만들기전에 먼저 준비해야할 사항들 먼저 내가 어디까지 만들지 그 범위를 정하자. 작년에 형태소 분석기 만들려고 했는데 관련된 책보다가 시간 다 갔다. 현재 형태소 분석기를 만드는 이유는 루씬 검색엔진에 붙이기 위함이다. Parser, Analyzer쪽 소스를 보니 어렵게 보이지는 않았다. 문제는 형태소 분석기를 만드는 것이다. 크게 사전방식과 통계적 방식이 있는데 통계적 방식은 준비해야할 것이 너무 많기 때문에 사전방식으로 만들생각이다. 사전방식이라면 돈주고 사야하겠지만 전 회사에서 사용하던 사전을 사용하자 그 사전에 각 품사별로 잘 정리가 되어 있으니 잘 추려서 사용하면 되겠다. 나중에 이 일이 잘되면 사전 튜닝을 하겠지만 현재로썬 사전튜닝에 시간을 들이고 싶지 않다. 그럼 가장 단시간안에 만들려면 어떻게 해야할까? 역시 동영상 강좌다.. 더보기