대용량 파일(80GB)을 수집하여 속도를 높이는 방법은 없습니까?
grep -i -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql
이것은 오버로드되지 않는 상당히 강력한 리눅스 서버에서 한 시간 동안 실행되었습니다.grep 말고 다른 대안은?내 구문에 대해 개선할 수 있는 것이 있습니까(예: 더 나은가요, fgrep?)
파일은 실제로 다른 서버에 있는 양과 공유되는 디렉토리에 있지만 실제 디스크 공간은 로컬이므로 차이가 없을 것입니다.
Grep는 최대 93%의 CPU를 점유하고 있습니다.
다음은 몇 가지 옵션입니다.
grep 명령 앞에 다음을 붙입니다.LC_ALL=C
UTF-8 대신 C 로케일을 사용합니다.
사용fgrep
정규식이 아닌 고정 문자열을 검색하기 때문입니다.
제거합니다.-i
필요 없는 경우 옵션을 선택할 수 있습니다.
명령은 다음과 같습니다.
LC_ALL=C fgrep -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql
또한 RAM 디스크에 파일을 복사하는 것이 더 빠를 것입니다.
멀티코어 CPU가 있다면 GNU 병렬을 정말 추천합니다.대용량 파일을 병렬로 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 문자열을 검색합니다.txt는 많은 시간을 절약합니다.위는 제가 현재 테스트 중인 것을 번역한 것입니다.-j 및 -n 옵션 값이 제 사용 사례에 가장 적합한 것 같습니다.-F 그렙은 또한 큰 차이를 만들었습니다.
립그립 해보기
grep에 비해 훨씬 더 좋은 결과를 제공합니다.
위의 답변들은 모두 훌륭했습니다.111GB 파일에서 실제로 도움이 된 것은 LC_ALL=C fgrep -m < maxnum > fixed_string 파일 이름을 사용한 것입니다.
그러나 0개 이상의 반복 패턴이 있을 수 있으며, 이 경우 최대값을 계산할 수 없습니다.해결 방법은 처리하려는 이벤트에 대해 시작 및 종료 패턴을 사용한 다음 두 이벤트 사이의 줄 번호에 대해 작업하는 것입니다.그런 것처럼 -
startline=$(grep -n -m 1 "$start_pattern" file|awk -F":" {'print $1'})
endline=$(grep -n -m 1 "$end_pattern" file |awk -F":" {'print $1'})
logs=$(tail -n +$startline file |head -n $(($endline - $startline + 1)))
그런 다음 이 로그 하위 집합에서 작업합니다!
합니까? 음…… 어떤속필까니십요하가도?? 저는 합성 제품을 만들었습니다.77.6 GB
…에 가까운 서류철로 철하다.525 mn
유니코드가행:
rows = 524759550. | UTF8 chars = 54008311367. | bytes = 83332269969.
균평도 무로 행선 위작 속로 ▁of▁at▁selected ▁and▁rows ▁randomly1 every 3^5
뿐만 아니라 을 사용하여NR % 243
을 놓다db_pd.Clients
기존 텍스트의 중간에 있는 임의의 위치에서, 합계.2.16 mn rows
하는 위치
rows = 2160088. | UTF8 chars = 42286394. | bytes = 42286394.
% dtp; pvE0 < testfile_gigantic_001.txt|
mawk2 '
_^(_<_)<NF { print (__=NR-(_+=(_^=_<_)+(++_)))<!_\
?_~_:__,++__+_+_ }' FS='db_pd[.]Clients' OFS=','
in0: 77.6GiB 0:00:59 [1.31GiB/s] [1.31GiB/s] [===>] 100%
out9: 40.3MiB 0:00:59 [ 699KiB/s] [ 699KiB/s] [ <=> ]
524755459,524755470
524756132,524756143
524756326,524756337
524756548,524756559
524756782,524756793
524756998,524757009
524757361,524757372
그리고.mawk2
딱 잡아먹음59 seconds
필요한 행 범위 목록을 추출합니다.거기서부터 그것은 비교적 사소한 것이어야 합니다.일부 중복이 있을 수 있습니다.
의 처리량 1.3GiB/s
에서 본 바와 가계산한으로 한 바와 .pv
심지어 다음과 같은 유틸리티를 사용하는 것은 해로울 수 있습니다.parallel
작업을 분할할 수 있습니다.
언급URL : https://stackoverflow.com/questions/13913014/grepping-a-huge-file-80gb-any-way-to-speed-it-up
'programing' 카테고리의 다른 글
보기 컨트롤러에 없을 때 UIAertController를 표시하는 방법은 무엇입니까? (0) | 2023.05.26 |
---|---|
왜 수학을 합니까?라운드(2.5)는 3 대신 2를 반환합니까? (0) | 2023.05.26 |
XSLT에 스플릿() 기능이 있습니까? (0) | 2023.05.26 |
'제출' 버튼을 비활성화하는 방법은 무엇입니까? (0) | 2023.05.26 |
최고의 전투함 AI는 무엇입니까? (0) | 2023.05.26 |