2012-02-21 2 views
1

"abcd * jklp *"와 같은 간단한 와일드 카드 검색을 통해 파일을 찾는 것이 심각한 성능 문제를 일으킬 정도로 큰 디렉토리에서 파일을 제공해야하는 웹 서버를 실행합니다.간단한 파일의 성능 Java에서 검색

Java에서 파일 검색 속도를 높이는 방법 (트릭 또는 라이브러리)이 있습니까? 그렇지 않다면 애플리케이션이 명시 적으로 캐시를 비우지 않는 한 각 검색이 한 번만 수행되는 간단한 캐싱 솔루션이 있습니까?

+1

트리 또는 디렉토리의 모든 파일을 캐시 할 수 있습니까? 트리에서 일치하는 파일 이름을 찾는 것이 OS보다 훨씬 빠를 것입니다. –

+0

좋은 생각, 나는 그것에 대해 조사 할 것이다. –

답변

2

웹 응용 프로그램이 시작될 때 (그리고 그 후 x 분 후에) 정적 변수로 제공하려는 모든 파일을 캐시합니다. 사용자가 특정 파일을 검색 할 때 실제 파일 서버에서 검색을 실행하는 대신 정적 캐시를 검색하십시오.

모두 허용하면 파일 이름을 검색하는 것이 좋습니다. 모든 파일 경로를 목록/배열에 저장할 수 있습니다. 목록/배열이 이미 정렬 된 경우 사용자 검색 쿼리에 대해 이진 검색을 사용할 수 있습니다. 와일드 카드가있는 경우 적절한 RegEx를 생성하십시오.

파일 내용을 전체 텍스트 검색하는 경우 정적으로 저장하는 것이 적합하지 않습니다. 데이터베이스를 사용하여 파일을 백업하거나 GSA와 같은 검색 어플라이언스를 구입하는 등의 게으른 작업을 수행하십시오. http://www.google.com/enterprise/search/gsa.html

+0

파일 내용의 전체 텍스트 검색이 필요하지 않습니다. 고정 된 타임 아웃에서 캐시를 무효화하고 완전히 다시 빌드하도록 제안 하시겠습니까? 이것은 매우 비싸게 들립니다 ... –

+0

@Tim van Beek - 값이 비싼 무엇에 비해? 모든 검색 요청에 대해 파일 서버의 모든 파일을 검색하는 것은 많은 비용이 듭니다. X 분마다 새 캐시를 생성하거나 현재 정적 캐시에서 파일을 추가 (새로 작성) 또는 제거 (삭제) 할 수 있습니다. 그러나 한동안 파일 서버의 모든 파일을 반복해야합니다. –

+0

마지막 문장은 내 질문에 대한 대답 인 것 같습니다. 파일 시스템에 변경 사항을 알리는 메커니즘이 있으면 잠시 동안 반복하지 말고 사용할 수 있는지 궁금했습니다. –

0

검색의 "속임수"는 초기 쿼리에 최대한 많은 정보를 제공하는 것입니다. 원하는 파일의 이름이 BobAndAlice이고 입력 문자열이 B* 인 경우 이론적으로는 Bo*을 사용하는 검색보다 느립니다. 캐싱은이 논의를 위해 HashMap과 비슷한 방식으로 조회 테이블을 작성하여 작동합니다. 본질적으로 각 검색은 제출시 Query Map에 대해 검사되고 실행 된 경우 Cache Emptied 플래그가 false로 설정되면 Lookup Table이 실행 쿼리의 결과에서 나온 모든 포인터가됩니다 . 이로써 이미 검색된 데이터의 검색이 가능해진다. 문제를 일으킬 수있는 곳은 파일 포인터 대신에 중복 된 파일 복사본을 저장하는 경우입니다. 동일한 프로세스가 실제로 사용자에게 파일을 제공하는 데 유효합니다.

0

이것은 Java 문제처럼 보입니다. 알고리즘 문제와 비슷합니다. 내가이 문제에서 이해 한 것은 주어진 디렉토리에 많은 수의 파일이 있고 그 조건에 맞는 파일을 처리하는 데 필요한 와일드 카드 패턴 문자열이 있다는 것입니다. 이것은 본질적으로 문자열이 많이 있고 특정 기준과 일치하는 문자열만을 찾아야하는 경우의 문자열 일치 문제입니다. 당신이 이것을 할 수있는 많은 옵션이 있지만, 접미사 트리의 접근 방식을 파일 검색에서 거의 o (n) 성능을 제공하기 때문에이 시나리오에 제안 할 것입니다.