회사 과제 질문드합니다. 파일 검색 프로그램!
지금 Everything 이라는 프로그램을 모방하여 파일 검색 프로그램을 제작하고 있습니다.
위 프로그램이 1분 정도 인덱싱 과정을 거치면, 모든 파일이 거의 실시간을 0.5초 안에 검색이 되더라구요.
저가 현제 C 드라이브에서 파일들을 읽어와 메모리에 연결리스트로 저장한 후
이름순으로 정렬하고, strstr 명령어로 비교하면서,
검색 문자열이 이름에 포함되어 있는지 검사하도록 했습니다.
20만개 정도 있을때, 한 글자를 입력하면 0.35 초 가량 나오더라구요..
좀 더 빠른 정렬을 위해서, 아스키 코드 별로 1글자 검색결과를 미리 저장하려고 하다가
메모리 부족현상으로 인해 다른 방법을 찾아보고 있습니다...
연결리스트를 배열로 바꿔서 접근속도를 높이거나, 문자열 검색 시
해시를 계산해서 비교 속도를 높인다던지 가능성 있는 방법들을 생각해보고 있습니다.
더 큰 문제는 MFC에서 결과를 출력해주는 과정인데요.
대략 50만개의 아이템을
for (int i = 0; i < 500000; i++) {
m_LC_result.InsertItem(i, _T("1")); // i번째 행 1번째열
m_LC_result.SetItem(i, 1, LVIF_TEXT, _T("Test"), NULL, NULL, NULL, NULL); // i번째 행 2번째열
}
이런식으로 테이블에 삽입하는데만, 1분 가량이 소요됩니다.
10만개도 거의 24초..
삭제는 그나마 50만일때, 10초 / 10만일 때 2초 가량 소요되는데.
Everything 프로그램처럼 1초 안에 모든 검색을 보여주는것이 불가능한 상황입니다...
제 입사 테스트문제라 꼭 해결을 해야해서
실력자 분들의 조언이 절실합니다. ㅠㅠ
부분일치 문자열을 탐색하는 과정 중 아이디어나,
MFC 결과를 어떻게 빨리 출력할 수 있는지 조언을 듣고 싶습니다.
이거는 알고리즘 문제 같은데요
이거는 알고리즘 문제 같은데요
순서대로 저장하시면 안될꺼같아요!
네 그런것 같아요
저도 이름으로 정렬한 순서대로 넣어서 비교하는 것보단 좋은 방법이 있을거라 생각하는데..
이게 한글자가 아니라 문자열이라.. 뭘 기준으로 잡아야 하는지 애매하네요 ㅠㅠ
수십만개의 검색결과가 나왔다고 해도,
수십만개의 검색결과가 나왔다고 해도,
이것을 전부 리스트컨트롤에 넣을려면 시간이 오래걸립니다.
이럴때는 화면에 보이는 정도만 추가하고, 나머지는 리스트 콘트롤을 스크롤할때 보여줄수도 있죠.
virtual list control 키워드로 한번 찾아보세요.
테이블문제는 가상 리스트로 해결하였습니다.
감사합니다.ㅎㅎ
1. 문자열은 고정길이 배열로 사용하고
1. 문자열은 고정길이 배열로 사용하고
(*파일명은 전체 경로를 포함하여 최대 259 글자이며, 루트 폴더에 가장 긴 255 글자의 파일을 만들 수 있다. 출처: http://hizstory.tistory.com/14)
2. 자료구조 종류에 따른 장단점을 잘 모르시는 것 같습니다.
인덱싱 한번 하면 삽입/삭제가 없고 검색이 대부분의 시간을 차지한다고 할 때
최적의 자료구조는 우선순위큐, 힙, 균형 이진트리 등이 적합합니다.
표준라이브러리로는 std::map, std::set등이 있으니 그걸 이용하면 될 듯 합니다.
검색을 위한 자료구조는 리스트의 경우 효율이 안좋습니다.
표준라이브러리는 사용하지 못할 거 같지만.
직접 구현이라 표준라이브러리는 사용 못하지만,
확실히 트리 같은 자료주고는 괜찮다고 생각합니다.
그런데, 길이가 각각 다르고, 입력 문자열이 다른 파일이름들은 어떻게 구성해야 할지 몰라 애를 먹고 있네요 ㅠㅠ
스트링 서치트리는 이놈이 널리쓰입니다. https:/
스트링 서치트리는 이놈이 널리쓰입니다. https://en.wikipedia.org/wiki/Trie
길이가 각각 다르고, 입력 문자열이 다른 파일이름들은
"길이가 각각 다르고, 입력 문자열이 다른 파일이름들은 어떻게 구성해야 할지 몰라 애를 먹고 있네요 ㅠㅠ"
>> 말씀드렸드시, 윈도우에서 경로를 포함한 파일이름의 최대길이는 259? 라고 합니다. 이걸 타입지정하세요
파일개수가 50만개라고 하셨으니까, 그걸 상한선으로 모든 파일 이름을 담을 수 있는file_array_t 구조체를 저렇게 정의하면 고작 150MB밖에 차지 않합니다.
1. 루트로 부터 파일이름을 읽어 배열끝에 추가한다.
2. qsort(), strcmp() 이용 정렬한다.
3. 정렬되어있으므로 이진탐색이 가능하다.
그리고 MFC에서 사용하는 자료구조는 검색 결과만 넣고 출력하세요.
댓글 달기