ugrep-indexer 유틸리티는 파일을 재귀적으로 색인화하여 재귀적 수집 속도를 높입니다.
또한 명령줄 옵션을 사용하여 지정하면 아카이브 및 압축 파일의 내용이 색인화됩니다. 이렇게 하면 해당 내용이 지정된 패턴과 일치하지 않을 때 검색이 제거됩니다.
ugrep은 인덱스 기반 검색을 지원하는 grep 호환 빠른 파일 검색기입니다. 인덱스 기반 검색은 느린 파일 시스템에서 그리고 파일 시스템 캐싱이 효과적이지 않은 경우 훨씬 더 빨라질 수 있습니다. 검색된 드라이브의 파일 시스템이 RAM에 캐시되지 않은 경우, 즉 "콜드"인 경우 인덱싱은 검색 속도를 높입니다. 파일의 인덱스를 사용하여 지정된 정규식 패턴과 일치할 수 있는 파일만 검색합니다. 이 색인을 사용하면 잠재적인 일치 항목이 있는지 빠르게 확인할 수 있으므로 모든 파일을 검색하지 않아도 됩니다.
ugrep을 사용한 색인 기반 검색은 안전하며 현재 일치할 수 있는 업데이트된 파일을 건너뛰지 않습니다. 인덱싱 후에 파일 및 디렉터리가 추가되거나 변경된 경우 검색에서는 파일 및 디렉터리 타임스탬프를 인덱싱 타임스탬프와 비교하여 파일 시스템에 대한 이러한 추가 및 변경 사항을 항상 검색합니다.
인덱싱 후 많은 파일이 추가되거나 변경되면 인덱스를 최신 상태로 유지하기 위해 다시 인덱싱할 수 있습니다. 재인덱싱은 증분식이므로 초기 인덱싱 프로세스만큼 시간이 많이 걸리지 않습니다.
예를 들어 별도의 드라이브에 있는 ugrep v3.12.6 저장소에 대한 인덱스 기반 검색의 일반적이지만 작은 예는 다음과 같습니다.
$ cd drive/ugrep
$ ugrep-indexer -I
12247077 bytes scanned and indexed with 19% noise on average
1317 files indexed in 28 directories
28 new directories indexed
1317 new files indexed
0 modified files indexed
0 deleted files removed from indexes
128 binary files ignored with --ignore-binary
0 symbolic links skipped
0 devices skipped
5605227 bytes indexing storage increase at 4256 bytes/file
인덱싱이 없는 콜드 파일 시스템에서 일반 검색은 drive
마운트 해제하고 다시 마운트하여 FS 캐시를 지워 인덱싱 효과를 기록한 후 1.02초가 걸립니다.
$ ugrep -I -l 'std::chrono' --stats
src/ugrep.cpp
Searched 1317 files in 28 directories in 1.02 seconds with 8 threads: 1 matching (0.07593%)
Ripgrep 13.0.0은 동일한 콜드 검색에 대해 1.18초로 더 오래 걸립니다(ripgrep은 기본적으로 바이너리 파일을 건너뛰므로 -I
옵션이 지정되지 않음).
$ time rg -l 'std::chrono'
src/ugrep.cpp
1.18 real 0.01 user 0.06 sys
이와 대조적으로 인덱싱을 사용하면 ugrep을 사용하여 콜드 파일 시스템을 검색하는 데 0.0487초만 소요됩니다. 이는 drive
마운트 해제하고 인덱싱 효과를 기록하기 위해 FS 캐시를 지우기 위해 다시 마운트한 후 21배 더 빠릅니다.
$ ugrep --index -I -l 'std::chrono' --stats
src/ugrep.cpp
Searched 1317 files in 28 directories in 0.0487 seconds with 8 threads: 1 matching (0.07593%)
Skipped 1316 of 1317 files with non-matching indexes
0.0487초(21배 속도 향상)에서 0.0983초(10배 속도 향상)의 검색 시간 범위를 생성한 4회 검색 실행 중 가장 좋은 시간인 0.0487초로 경과 시간에는 항상 약간의 차이가 있습니다.
여러 요인, 인덱싱된 파일의 크기, 파일 시스템의 읽기 속도 및 대부분의 파일이 콜드 상태라는 가정하에 따라 일반적으로 이 작은 데모에 비해 속도 증가가 훨씬 더 높을 수 있습니다.
내가 디자인한 인덱싱 알고리즘은 단조로운 것으로 입증되었습니다 . 정확도가 높을수록 거짓 긍정 비율을 줄여 검색 성능이 향상되지만 인덱스 저장 오버헤드도 증가합니다. 마찬가지로 정확도가 낮을수록 검색 성능이 저하되지만 인덱스 저장 오버헤드도 줄어듭니다. 따라서 나는 내 인덱서를 단조로운 인덱서 라고 명명했습니다.
파일 저장 공간이 부족한 경우 인덱싱 정확도를 더 낮게 지정하여 인덱스 저장 오버헤드를 줄일 수 있습니다.
위의 예제를 레벨 0(옵션 -0
)으로 인덱싱하면 인덱싱 저장소 오버헤드가 파일당 4256바이트에서 파일당 490바이트로 8.6배 줄어듭니다.
12247077 bytes scanned and indexed with 42% noise on average
1317 files indexed in 28 directories
0 new directories indexed
1317 new files indexed
0 modified files indexed
0 deleted files removed from indexes
128 binary files ignored with --ignore-binary
0 symbolic links skipped
0 devices skipped
646123 bytes indexing storage increase at 490 bytes/file
이 예에서는 색인화된 검색이 색인화되지 않은 검색보다 여전히 12배 더 빠릅니다. 실제로 검색된 파일은 16개입니다(15개의 거짓 긍정).
Searched 1317 files in 28 directories in 0.0722 seconds with 8 threads: 1 matching (0.07593%)
Skipped 1301 of 1317 files with non-matching indexes
이 예보다 더 복잡한 정규식 패턴은 자연스럽게 일치하지 않을 때 일치하는 것으로 간주되는 파일의 비율인 거짓 긍정 비율이 더 높을 수 있습니다. 오탐률이 높을수록 영향을 미칠 만큼 높을 경우 검색 속도가 느려질 수 있습니다.
다음 표에서는 인덱싱 정확도가 인덱싱 저장소와 인덱싱된 파일당 평균 노이즈에 어떤 영향을 미치는지 보여줍니다. 가장 오른쪽 열에는 ugrep --index -I -l 'std::chrono'
에 대한 검색 속도와 거짓 긍정 비율이 표시됩니다.
acc. | 인덱스 스토리지(KB) | 평균 소음 | 거짓 긍정 | 검색 시간(초) |
---|---|---|---|---|
-0 | 631 | 42% | 15 | 0.0722 |
-1 | 1276 | 39% | 1 | 0.0506 |
-2 | 1576년 | 36% | 0 | 0.0487 |
-3 | 2692 | 31% | 0 | 인치 |
-4 | 2966 | 28% | 0 | 인치 |
-5 | 4953 | 23% | 0 | 인치 |
-6 | 5474 | 19% | 0 | 인치 |
-7 | 9513 | 15% | 0 | 인치 |
-8 | 10889 | 11% | 0 | 인치 |
-9 | 13388 | 7% | 0 | 인치 |
지정된 정규 표현식이 더 많은 가능한 패턴과 일치하는 경우(예: ugrep --index -I -l '(todo|TODO)[: ]'
검색) 검색된 1317개 파일 중에서 더 높은 비율의 오탐률을 관찰할 수 있습니다. 결과적으로 검색 시간이 약간 길어집니다.
acc. | 거짓 긍정 | 검색 시간(초) |
---|---|---|
-0 | 189 | 0.292 |
-1 | 69 | 0.122 |
-2 | 43 | 0.103 |
-3 | 19 | 0.101 |
-4 | 16 | 0.097 |
-5 | 2 | 0.096 |
-6 | 1 | 인치 |
-7 | 0 | 인치 |
-8 | 0 | 인치 |
-9 | 0 | 인치 |
정확도 -4
기본값(이전 릴리스의 -5
)이며, 보통의 복잡성을 지닌 정규식 패턴을 검색하는 데 매우 잘 작동하는 경향이 있습니다.
주의할 점 한 마디. 인덱스를 확인하는 데는 항상 약간의 오버헤드가 있습니다. 이는 모든 파일이 이미 RAM에 캐시되어 있는 경우 최근에 파일을 검색했거나 읽었기 때문에 인덱싱이 반드시 검색 속도를 높이지는 않는다는 것을 의미합니다. 이 경우 색인화되지 않은 검색이 더 빠를 수 있습니다. 또한 인덱스 기반 검색은 시작 시간이 더 깁니다. 해시 테이블로 변환해야 하는 유니코드 문자 클래스와 와일드카드를 사용하면 이 시작 시간이 늘어납니다.
요약하자면, 인덱스 기반 검색은 많은 콜드 파일을 검색할 때와 정규식 패턴이 너무 많이 일치하지 않을 때 가장 효과적입니다. 즉, 무제한 반복 *
및 +
의 사용을 제한하고 다음과 같은 경우 유니코드 문자 클래스의 사용을 제한하려고 합니다. 가능한. 이렇게 하면 ugrep 시작 시간이 줄어들고 잘못된 긍정 패턴 일치 비율이 제한됩니다(아래 Q&A 참조).
진행 상황을 표시하는 모든 비바이너리 파일을 재귀적으로 증분적으로 색인화합니다.
ugrep-indexer -I -v
아카이브 및 압축 파일에 저장된 비바이너리 파일을 포함하여 모든 비바이너리 파일을 반복적으로 증분적으로 인덱싱하여 진행 상황을 표시합니다.
ugrep-indexer -z -I -v
아카이브 및 압축 파일을 포함하여 모든 비바이너리 파일을 증분적으로 인덱싱하고, 진행률을 표시하고, 파일에 대한 기호 링크를 따르지만(디렉터리는 아님) .gitignore의 glob과 일치하는 파일 및 디렉터리는 인덱싱하지 않습니다.
ugrep-indexer -z -I -v -S -X
아카이브 및 압축 파일을 포함하여 모든 비바이너리 파일을 강제로 다시 인덱싱하고 파일에 대한 기호 링크를 따르지만(디렉터리는 제외) .gitignore의 glob과 일치하는 파일 및 디렉터리는 인덱싱하지 않습니다.
ugrep-indexer -f -z -I -v -S -X
동일하지만 인덱싱 정확도를 5(기본값)에서 0으로 줄여 인덱스 파일 저장 공간을 최소로 줄입니다.
ugrep-indexer -f -0 -z -I -v -S -X
더 큰 인덱스 파일을 사용하여 인덱싱 정확도를 5(기본값)에서 7로 늘려 검색 성능을 높입니다.
ugrep-indexer -f7zIvSX
모든 숨겨진 ._UG#_Store
인덱스 파일을 반복적으로 삭제하여 디렉터리 트리를 인덱스되지 않은 상태로 복원합니다.
ugrep-indexer -d
다음을 사용하여 구성하고 컴파일합니다.
./build.sh
원하지만 필수는 아닌 경우 다음을 사용하여 설치하십시오.
sudo make install
하나의 인덱스 파일을 생성하는 옵션을 추가합니다(예: ugrep에 명시적으로 지정). 인덱스 파일이 빠른 파일 시스템에 있는 경우 인덱스 검색 속도가 더욱 향상될 수 있습니다. 그렇지 않으면 단일 인덱스 파일을 동시에 검색할 수 없으며 실제로 디렉터리를 건너뛸 때(해당 인덱스도 건너뛰기) 더 많은 인덱스 항목을 검사하므로 많은 개선이나 속도 저하가 예상되지 않습니다. 실험을 통해 알 수 있습니다. 이 접근 방식의 중요한 주의 사항은 ugrep --index
사용한 인덱스 기반 검색이 더 이상 안전하지 않다는 것입니다. 아직 인덱스되지 않은 새 파일과 수정된 파일은 검색되지 않습니다.
각 N-그램 블룸 필터에는 해시 충돌을 방지하기 위해 해시 테이블에 자체 "비트 계층"이 있습니다. 예를 들어 2그램은 3그램과 어떤 비트도 공유하지 않습니다. 이렇게 하면 실제로 패턴의 일부가 아닌 문자가 잘못 일치하여 잘못된 긍정이 발생하지 않습니다. 그러나 1그램(단일 문자) 비트 공간은 작습니다(최대 256비트). 따라서 해시 테이블이 더 클 때 일부 비트를 낭비합니다. 낭비를 줄이기 위한 가능한 접근 방식은 1그램과 2그램을 결합하여 동일한 비트 공간을 공유하는 것입니다. 1그램이 두 번째 문자가