사용 사례: 일주일 전체에 대한 수 GB의 로그 파일이 있고 예를 들어 grep
지식을 바탕으로 추측하고 파일 중간에 검색을 시작하면 처리 시간이 절반 이상 단축될 것이라고 가정합니다. 관련 데이터를 건너뛰지 않고 파일 섹션의 나머지 전체를 처리할 필요는 없습니다. 가능합니까?
답변1
데이터가 시간순으로 정렬되어 있다고 가정합니다.
- 끝을 살펴보고 다음을 수행하여 파일 크기를 확인하세요
ftell()
. - 결과를 2로 나눕니다.
fseek()
위치를 찾는 데 사용됩니다 .- 한 번 호출하여 다음 줄의 시작 부분을 찾습니다
getline()
. strptime()
현재 날짜를 아는 데 사용됩니다 .- 이진 검색을 수행하고 원하는 행을 찾을 때까지 4단계와 5단계를 반복합니다.
답변2
dd
다음과 같이 사용할 수 있습니다 .
dd if=log skip=xK bs=1M
그러면 크기가 1M(2^20)인 x * 1024개 블록을 건너뜁니다. dd(1)
장치 취급에 대한 자세한 내용은 참고자료를 참조하세요.
<date> [data]
로그가 출력을 파이프할 수 있는 일반적인 형식이라고 가정하고 이진 검색을 자동화하려면 head -n 2
로그 시작 부분의 날짜를 확인하세요.두번째라인("보통" 긴 라인이 완료될 것이라는 합리적인 가정하에) 원하는 절반을 결정하십시오.
답변3
파일 크기를 구해 2로 나눕니다. 이것을 1024로 나누어 KiB를 얻습니다. (또는 MiB 등을 얻으려면 1024*1024)
((fs = $(stat -c %s logfile) / 2 / 1024))
건너뛰고 검색해 보세요
dd if=logfile bs=1024 skip=$fs | grep blahblah
로그 파일이 다음과 같은 경우 이를 더 확장할 수 있습니다.매우데이터의 양은 pr과 일치합니다. 일 count=
에 값을 추가하여 dd
.
((cnt = $(stat -c %s logfile) / 5 / 1024))
dd if=logfile bs=1024 skip=$fs count=$cnt | grep blahblah
이는 cnt * 1024
오프셋 바이트로 데이터 바이트를 전송 합니다 fs * 1024
.
모든 것을 스크립트로 감싸고 스크립트 외부의 파이프를 grep, 임시 파일 또는 원하는 대로 수행합니다.
답변4
정확히 무엇을 하려는지, "프로세스"가 무엇을 의미하는지 명확하지 않습니다. 내가 가장 좋아하는 대용량 파일용 대화형 프로그램은 입니다 less
. 이 프로그램은 대용량 파일을 문제 없이 처리합니다. 예를 들어 를 사용하여 특정 백분율로 이동할 수도 있습니다 30%
. 또한 /
및 를 사용하여 검색 할 수 있습니다 ?
.