sed가 왜 그렇게 빠른가요?

sed가 왜 그렇게 빠른가요?

이 질문이 SE에 적합한지 생각해 보았습니다. 동의하시기 바랍니다.

얼마 전 SE에 파일에서 텍스트를 찾고 검색 중인 텍스트가 포함된 일치하는 줄만 유지하는 방법을 물었습니다. 문제는 여기에 있습니다: OS X에서 터미널을 사용하여 파일에서 텍스트를 찾고 해당 일치하는 줄만 유지하려면 어떻게 해야 합니까?

sed대답은 완벽했지만, 이제 왜 그렇게 빠른지 궁금합니다 . 내 사용 사례에는 총 크기가 약 30GB인 파일이 꽤 많이 있습니다. 명령 은 sed약 12초 동안 실행되었는데, 이는 제 마음을 놀라게 했습니다(일반 HDD 사용). 12초 만에 이 명령은 30GB의 텍스트를 읽고 필터링한 해당 줄만 유지하기 위해 각 파일을 자릅니다.어떻게 작동하나요?(또는: 이것은 어떤 종류의 마법입니까?)

실제 명령은 다음과 같습니다.

find . -type f -exec sed -i'' '/\B\/foobar\b/!d' {} \;

답변1

가능한 대답은 다음과 같습니다:

  1. 조각화가 없거나 조각화가 거의 없는 30Gb 파일: 모든 하드 드라이브는 대용량 파일 청크를 캐시하는 기능으로 인해 순차 액세스(SSD 포함)에서 더 나은 성능을 발휘합니다. 이를 통해 최고의 성능을 달성할 수 있습니다. 순차적 액세스는 모든 수준의 캐싱에 도움이 됩니다.
  2. sed스트림 편집기는 한 번에 한 줄씩 처리합니다. 이는 메모리 공간이 작다는 것을 의미합니다. emacsWindows나 Mac과 같은 텍스트 편집기 와 달리 vim메모리에 파일의 전체 복사본을 유지할 필요가 없습니다.
  3. -i@Ramesh가 제안한대로 (을 사용하여) 파일을 제자리에서 편집하고 있습니다.위키피디아 페이지)는 임시 파일을 생성한 다음 이전 파일이 됩니다.

이것이 의미하는 바 sed는 거의 최소한의 파일 작업을 수행할 수 있다는 것입니다. 즉, 원본 파일의 각 줄을 한 번 읽고 일치하는 줄만 기록합니다.

정규식 선택은 성능에 영향을 미치며 때로는 매우 나쁜 방식으로 영향을 줍니다.코딩 호러 블로그.

답변2

좋은 예는 sed임시 파일을 사용하여 실제로 콘텐츠를 저장한 다음 원본 파일을 바꾸는 것입니다. 예를 들어, 이를 찾기 위해 간단한 테스트를 수행할 수 있습니다.

cat test
This is a test file. 

이제 실행 ls -li하여 inode 번호를 확인합니다.

ls -li test
2368770 -rw-r--r-- 1 root root 22 Sep 12 08:46 test

이제 다음 sed명령을 실행하여 빈 줄을 추가합니다.

sed -i 's/2/B/' test

파일을 변경한 후 ls다시 명령어를 실행하여 inode 번호를 확인한다.

ls -li test
2368753 -rw-r--r-- 1 root root 22 Sep 12 08:48 test

실제로 inode 번호가 변경된 것을 확인할 수 있습니다. 따라서 동일한 파일에 복사하는 대신 sed새 임시 파일을 만들고 내용을 새 임시 파일에 복사한 다음 원본 파일을 삭제하고 원본 파일과 동기화하여 tmp 파일 이름을 바꾸면 파일 작업이 실제로 더 빨라집니다.

에서 인용위키피디아 페이지,

sed는 라인 지향 텍스트 처리 유틸리티입니다. 입력 스트림이나 파일에서 패턴 공간이라는 내부 버퍼로 텍스트를 한 줄씩 읽습니다. 한 줄을 읽을 때마다 루프가 시작됩니다. 패턴 공간의 경우 sed는 sed 스크립트를 통해 지정된 하나 이상의 작업을 적용합니다. sed는 텍스트에 대한 작업을 지정하는 약 25개의 명령으로 프로그래밍 언어를 구현합니다. 각 라인에 대해 스크립트를 실행한 후 sed는 일반적으로 패턴 공간(스크립트에 의해 수정된 입력 라인)을 출력하고 다음 라인에서 루프를 다시 시작합니다.

패턴 공간과 홀드 공간 개념에 대해 더 자세히 알고 싶으면 sed답변을 읽어야 합니다.여기.

sed가 파일을 한 줄씩 읽으면 현재 읽은 줄이 패턴 버퍼(패턴 공간)에 삽입됩니다. 모드 버퍼는 현재 정보가 저장되는 스크래치 패드인 임시 버퍼와 같습니다. sed에게 인쇄하라고 지시하면 패턴 버퍼가 인쇄됩니다.

예약된 버퍼/예약 공간은 장기 저장소와 같으므로 sed가 다른 라인을 처리하는 동안 무언가를 캡처하고 저장하고 재사용할 수 있습니다. 예약된 공간을 직접 처리하지 않고, 대신 무언가를 수행하려면 패턴 공간에 복사하거나 추가해야 합니다.

관련 정보