[bash] 속도를 높이기 위해 대용량 파일 (80GB)을 저장 하시겠습니까?

 grep -i -A 5 -B 5 'db_pd.Clients'  eightygigsfile.sql

이것은 과부하가 걸리지 않는 상당히 강력한 리눅스 서버에서 한 시간 동안 실행되었습니다. grep에 대한 대안이 있습니까? 개선 할 수있는 내 구문에 대한 모든 것, (egrep, fgrep 더 나은가?)

파일은 실제로 다른 서버에 마운트와 공유되는 디렉토리에 있지만 실제 디스크 공간은 로컬이므로 차이가 없습니다.

grep은 최대 93 % CPU를 차지합니다.



답변

다음은 몇 가지 옵션입니다.

1) LC_ALL=CUTF-8 대신 C 로켈을 사용하려면 grep 명령을 접두사로 지정하십시오 .

2) fgrep정규 표현식이 아닌 고정 문자열을 검색하기 때문에 사용하십시오 .

3) -i필요하지 않은 경우 옵션을 제거합니다 .

따라서 명령은 다음과 같습니다.

LC_ALL=C fgrep -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql

파일을 RAM 디스크에 복사하면 더 빠릅니다.


답변

멀티 코어 CPU가 있다면 정말 GNU parallel을 권장 합니다 . 큰 파일을 병렬로 grep하려면 다음을 수행하십시오.

< eightygigsfile.sql parallel --pipe grep -i -C 5 'db_pd.Clients'

디스크 및 CPU에 따라 더 큰 블록을 읽는 것이 더 빠를 수 있습니다.

< eightygigsfile.sql parallel --pipe --block 10M grep -i -C 5 'db_pd.Clients'

질문에서 완전히 명확하지는 않지만 다음과 같은 다른 옵션이 grep있습니다.

  • -i깃발을 떨어 뜨리는 것 .
  • -F고정 문자열에 플래그 사용
  • NLS 비활성화 LANG=C
  • -m플래그 와 일치하는 최대 수를 설정합니다 .

답변

사소한 개선 :

  • 가능한 경우 -i 옵션을 제거하십시오. 대소 문자를 구분하지 않는 것이 매우 느립니다.

  • 를 교체 .하여\.

    단일 지점은 모든 문자와 일치하는 정규식 기호이며 속도도 느립니다.


답변

두 줄의 공격 :

  • 확실 -i합니까 ,이 필요 합니까, 아니면 제거 할 가능성이 있습니까?
  • 플레이 할 코어가 더 있습니까? grep단일 스레드이므로 다른 오프셋에서 더 많은 것을 시작할 수 있습니다.

답변

< eightygigsfile.sql parallel -k -j120% -n10 -m grep -F -i -C 5 'db_pd.Clients'  

여러 문자열을 검색해야하는 경우 grep -f strings.txt를 사용하면 많은 시간을 절약 할 수 있습니다. 위의 내용은 현재 테스트중인 내용을 번역 한 것입니다. -j 및 -n 옵션 값이 내 사용 사례에 가장 잘 작동하는 것 같습니다. -F grep도 큰 차이를 만들었습니다.


답변