programing

대용량 파일(80GB)을 수집하여 속도를 높이는 방법은 없습니까?

muds 2023. 5. 26. 22:53
반응형

대용량 파일(80GB)을 수집하여 속도를 높이는 방법은 없습니까?

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

이것은 오버로드되지 않는 상당히 강력한 리눅스 서버에서 한 시간 동안 실행되었습니다.grep 말고 다른 대안은?내 구문에 대해 개선할 수 있는 것이 있습니까(예: 더 나은가요, fgrep?)

파일은 실제로 다른 서버에 있는 양과 공유되는 디렉토리에 있지만 실제 디스크 공간은 로컬이므로 차이가 없을 것입니다.

Grep는 최대 93%의 CPU를 점유하고 있습니다.

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

grep 명령 앞에 다음을 붙입니다.LC_ALL=CUTF-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

반응형