fsearch를 윈도우로 포팅했습니다: Rust 기반 전체 디스크 파일 검색, 500만 개 파일 대상 1ms 내외 쿼리
I ported fsearch to Windows: whole-disk file search in Rust, ~1 ms name queries over 5M files
핵심 요약
Rust로 구현한 윈도우용 고성능 파일 검색 도구 'Scry'를 소개하며, 관리자 권한 없이도 빠른 검색과 파일 내부 검색 기능을 제공합니다.
- 고성능 검색 — 500만 개 이상의 파일을 1ms 내외로 검색함
- 권한 요구 없음 — 관리자 권한이나 별도 서비스 없이 사용자 계정으로 실행됨
- 다양한 기능 — 오타 허용 랭킹, 파일 내부 검색, CLI 및 API 지원
- 기술적 구현 — NTFS 변경 저널 활용 및 Win32 API 기반의 효율적인 인덱싱
Noah Dunnagan이 만든 fsearch(macOS, MIT)를 윈도우로 포팅한 Scry를 개발 중이야. 고정 드라이브에 있는 모든 파일과 폴더를 인덱싱해서 입력하는 즉시 결과를 보여주는데, Alt+Shift+Space로 여는 검색창, CLI, 그리고 JSON-over-named-pipe API를 지원해.
내 노트북(i7-11850H, NVMe, Defender 켜짐, C: 드라이브 파일/폴더 508만 개, 개발용으로 빡세게 굴리는 중)에서 돌린 결과야. 이름 쿼리는 scry bench로 20번 돌린 중앙값임.
one word (invoice) | 0.5 ms |
with a typo (mian.rs finds main.rs) | 1.2 ms |
two words (src main) | 11 ms |
with a filter (ext:pdf invoice) | 0.07 ms |
| a new, renamed or deleted file is searchable | ~0.1 s |
| search inside files, literal / regex (warm) | 2–10 ms / ~60 ms |
| first crawl of the whole drive | 50–80 s, once |
| memory | ~22 MB private, plus a 190 MB index mmap’d from disk |
어떻게 돌아가는지 설명해 줄게(인덱스 설계는 Noah의 방식이고, 윈도우 쪽 구현은 새로 짰어):
-
Crawl: 각 폴더를 부모 핸들(
NtOpenFile) 기준으로 열고GetFileInformationByHandleEx로 한꺼번에 긁어와. 그래서 파일 하나하나 stat 칠 필요 없이 폴더당 몇 번 호출만으로 이름, 크기, 시간을 다 가져옴. 동시에 16개씩 읽어 들여. -
Index: mmap으로 매핑된 하나의 평탄한 블롭(blob)이야. 폴더별로 깊이 우선 탐색(depth-first) 순서대로 써 내려가서, 모든 폴더의 하위 트리가 연속된 범위로 잡혀. 그래서
in:C:\Projects같은 건 필터가 아니라 범위 제한으로 처리돼. 이름은 인터닝(interning) 처리하고, 고유한 이름마다 쿼리당 한 번씩 점수를 매겨. -
Staying live: 각 드라이브 루트에서
ReadDirectoryChangesW를 돌려. 변경 사항이 생기면 해당 폴더를 다시 리스트업해서 차이점을 반영해. 재시작 후에는 NTFS 변경 저널(관리자 권한 없이 읽기 가능)을 확인해서 어떤 폴더가 바뀌었는지 파악함.


