gzip 파일에서 문자열로 시작하는 줄을 찾는 가장 빠른 방법

gzip 파일에서 문자열로 시작하는 줄을 찾는 가장 빠른 방법

저는 65536개의 파일을 기반으로 하는 플랫 데이터베이스를 가지고 있습니다. 각 파일에는 두 개의 16진수 문자로 시작하는 한 줄씩 단어가 포함되어 있습니다.

그것들은 다음과 같습니다:

afword
46word2
Feword3
...

저는 이에 대해 매일 수만 건의 요청을 하기 때문에 두 개의 16진수 문자로 시작하는 줄을 찾는 더 좋은 방법을 찾고 있습니다. 파일은 gzip보다 먼저 정렬됩니다.

현재 나는 이렇게 한다:

LC=ALL zgrep --text '^af' file

Perl이나 Bash 또는 명령줄에서 이 작업을 수행하는 다른 더 빠른 방법이 있습니까?

답변1

zgrep(첨부됨 gzip)은 결국 유사한 작업을 수행하게 될 쉘 스크립트입니다 zcat | grep. zutilsC++로 작성되었으며 더 많은 압축 형식을 지원한다는 점을 제외하면 동일한 작업을 수행합니다 . 여전히 파이프를 통해 연결된 별도의 프로세스를 호출 gzip합니다 .grep

이런 간단한 검색으로 grep작업은 zcat그보다 훨씬 간단하므로 데이터 정리에 있어 동일한 접근 방식을 유지한다면 압축 측면을 개선하는 데 집중하는 것이 좋습니다.

here 을 사용하여 생성된 파일로 작업할 때 xxd -p -c35 < /dev/urandom | head -n 760000 | sortgzip으로 압축되어 있음을 발견했습니다. pigz -dc대신 zcat(일명 gzip -dc)을 사용하면 속도가 2배 증가했습니다.

압축하면 lz4 --best30% 더 큰 파일을 얻었지만 압축을 푸는 데 100배 더 적은 시간이 걸렸습니다.

$ zstat +size a*(m-1)| sort -k2n | column -t
a.xz    26954744
a.lrz   26971363
a.bz2   27412562
a.gz    30353089
a.gz3   30727911
a.lzop  38000050
a.lz4   40261510
a       53960000
$ time lz4cat a.lz4 > /dev/null
lz4cat a.lz4 > /dev/null  0.06s user 0.01s system 98% cpu 0.064 total
$ time pigz -dc  a.gz > /dev/null
pigz -dc a.gz > /dev/null  0.36s user 0.02s system 126% cpu 0.298 total
$ time gzip -dc a.gz > /dev/null
gzip -dc a.gz > /dev/null  0.47s user 0.00s system 99% cpu 0.476 total
$ time lz4cat a.lz4 | LC_ALL=C grep '^af' > /dev/null
lz4cat a.lz4  0.07s user 0.02s system 60% cpu 0.142 total
LC_ALL=C grep '^af' > /dev/null  0.07s user 0.00s system 53% cpu 0.141 total
$ time pigz -dc a.gz | LC_ALL=C grep '^af' > /dev/null
pigz -dc a.gz  0.36s user 0.04s system 130% cpu 0.303 total
LC_ALL=C grep '^af' > /dev/null  0.06s user 0.01s system 23% cpu 0.302 total
$ time gzip -dc a.gz | LC_ALL=C grep '^af' > /dev/null
gzip -dc a.gz  0.51s user 0.00s system 99% cpu 0.513 total
LC_ALL=C grep '^af' > /dev/null  0.08s user 0.01s system 16% cpu 0.512 total

lzop --bestlz4내 샘플에서는 가까운 초 이며 약간 더 잘 압축되었습니다.

$ time lzop -dc a.lzop | LC_ALL=C grep '^af' > /dev/null
lzop -dc a.lzop  0.24s user 0.01s system 85% cpu 0.293 total
LC_ALL=C grep '^af' > /dev/null  0.07s user 0.01s system 27% cpu 0.292 total

관련 정보