2014-06-12 2 views
1

grep가 내부적으로 어떻게 작동하는지 알고 싶습니다. 특히 첫 경기를 찾는 것이 모든 경기를 찾는 것보다 훨씬 더 빠르다는 것을 알고 싶습니다. 예를 들어 첫 번째 일치 항목은 파일 시작 부분의 10 % 지점에서 발생하며 모든 일치 항목이 파일 전체에 퍼집니다. 그럼 첫 번째 일치를 찾는 것만으로도 grep은 모든 일치를 찾는 것보다 훨씬 적은 파일 내용을 처리합니다 (이 경우 grep은 이전 파일의 10 %와 비교하여 전체 파일을 통과해야 함). 내 가정이 올바른지 알고 싶습니다. 가능한 개선이 내 처리 작업을 크게 향상시킬 수 있기 때문입니다. 감사합니다. .Grep 내부 작동 원리

+0

@FlorinStingaciu @FlorinStingaciu 나는 핵심 알고리즘에 대한 지식이 충분하지 않아 이해할 수 없으며'grep'에 대해 모든 것을 이해하는 데 3 개월을 쓸 가치가 없습니다. 내 프로젝트는 이미 그때까지 끝났어. 어떻게 작동하는지 알면 나 한테 줄까요? – zyl1024

+1

어떻게 작동하는지 모르겠습니다. 하지만 간단한 테스트를 만들어 보시지 않으시겠습니까? 여러 개의 검색이 일치하는 대용량 파일 (> 1GB)이 있어야합니다. grep이 첫 번째 일치 항목을 반환하고 시간을 지정합니다. grep이 모든 일치 항목과 시간을 찾을 수있게합니다. 그것은 당신에게 당신이 찾고있는 대답을 줄 것입니다. –

답변

3

파일에서 일치하는 모든 줄을 인쇄하려면 grep을 사용하는 경우 물론 전체 파일을 처리해야합니다.

grep -q을 사용하여 하나 이상의 일치 항목이 발견되면 성공적인 종료 상태를 생성하는 경우 물론 grep은 첫 번째 일치시 중지 될 수 있습니다. 첫 번째 일치 항목이 파일의 초기에 발견되면 grep이 즉시 해당 지점에서 나가고 성공적인 종료 상태를 반환 할 수 있으므로 시간이 절약됩니다. 파일에 일치하는 항목이 없으면 (최악의 경우) 전체 파일을 처리해야합니다. 이 경우 전체 파일을 처리해야합니다. 일치하지 않는 이유는 무엇일까요? 가장 마지막 행에서만 일치가 발생하지만 grep이 해당 행을 무시하면 일치하는 항목이 잘못보고됩니다.

Grep은 패턴을 정규식으로 컴파일합니다. 정규 표현식의 구조와 관련하여 성능에 영향을 줄 수 있습니다. 일부 정규식은 다른 정규식보다 성능이 우수합니다. 사용 된 알고리즘에 따라 작게 나타나는 일부 정규 표현식은 많은 수의 상태가있는 상태 시스템을 생성 할 수 있습니다.

검색 속도를 높이기위한 기술은 색인 생성입니다. 텍스트 모음에서 특정 단어를 자주 찾는 경우 단어를 색인에 포함하면 해당 단어가 코퍼스에서 발견되는 위치를 나타내는 것이 더 빠릅니다. 색인은 단어가있는 위치 목록이 텍스트를 스캔하지 않고 매우 빠르게 검색되도록 구성됩니다. 색인을 작성하는 데 시간이 걸리며 (텍스트 본문 전체를 스캔해야 함) 코퍼스가 변경되면 색인을 다시 작성해야합니다.

이것은 GNU Id-Utils와 같은 컴퓨터 프로그램 소스 코드에서 식별자 검색 속도를 높이는 도구의 기초입니다. 물론 색인 생성은 Google과 같은 월드 와이드 웹 검색 엔진의 기초입니다.

1

grep 소스 코드 (버전 2.18)를 간략하게 살펴보면 /src/main.cdone_on_match이라는 변수가 있습니다.이 변수는 설정 한 경우 첫 번째 일치 후 검색을 중지해야합니다. 이 변수는 -l, -L 또는 -q (및 기타 변수)에 설정됩니다. 그래서 예, 첫 경기를 검색하면 grep이 먼저 있어야합니다.

내가 말했듯이 이렇게하면 처리 속도가 빨라지는 것이 확실하지 않다. 대기 시간이 파일 I/O 일 가능성이 높다.