[bash] 속도를 높이기 위해 대용량 파일 (80GB)을 저장 하시겠습니까?
grep -i -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql
이것은 과부하가 걸리지 않는 상당히 강력한 리눅스 서버에서 한 시간 동안 실행되었습니다. grep에 대한 대안이 있습니까? 개선 할 수있는 내 구문에 대한 모든 것, (egrep, fgrep 더 나은가?)
파일은 실제로 다른 서버에 마운트와 공유되는 디렉토리에 있지만 실제 디스크 공간은 로컬이므로 차이가 없습니다.
grep은 최대 93 % CPU를 차지합니다.
답변
다음은 몇 가지 옵션입니다.
1) LC_ALL=C
UTF-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도 큰 차이를 만들었습니다.