![gzip 파일에서 문자열로 시작하는 줄을 찾는 가장 빠른 방법](https://linux55.com/image/194676/gzip%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%EB%AC%B8%EC%9E%90%EC%97%B4%EB%A1%9C%20%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94%20%EC%A4%84%EC%9D%84%20%EC%B0%BE%EB%8A%94%20%EA%B0%80%EC%9E%A5%20%EB%B9%A0%EB%A5%B8%20%EB%B0%A9%EB%B2%95.png)
저는 65536개의 파일을 기반으로 하는 플랫 데이터베이스를 가지고 있습니다. 각 파일에는 두 개의 16진수 문자로 시작하는 한 줄씩 단어가 포함되어 있습니다.
그것들은 다음과 같습니다:
afword
46word2
Feword3
...
저는 이에 대해 매일 수만 건의 요청을 하기 때문에 두 개의 16진수 문자로 시작하는 줄을 찾는 더 좋은 방법을 찾고 있습니다. 파일은 gzip보다 먼저 정렬됩니다.
현재 나는 이렇게 한다:
LC=ALL zgrep --text '^af' file
Perl이나 Bash 또는 명령줄에서 이 작업을 수행하는 다른 더 빠른 방법이 있습니까?
답변1
zgrep
(첨부됨 gzip
)은 결국 유사한 작업을 수행하게 될 쉘 스크립트입니다 zcat | grep
. zutils
C++로 작성되었으며 더 많은 압축 형식을 지원한다는 점을 제외하면 동일한 작업을 수행합니다 . 여전히 파이프를 통해 연결된 별도의 프로세스를 호출 gzip
합니다 .grep
이런 간단한 검색으로 grep
작업은 zcat
그보다 훨씬 간단하므로 데이터 정리에 있어 동일한 접근 방식을 유지한다면 압축 측면을 개선하는 데 집중하는 것이 좋습니다.
here 을 사용하여 생성된 파일로 작업할 때 xxd -p -c35 < /dev/urandom | head -n 760000 | sort
gzip으로 압축되어 있음을 발견했습니다. pigz -dc
대신 zcat
(일명 gzip -dc
)을 사용하면 속도가 2배 증가했습니다.
압축하면 lz4 --best
30% 더 큰 파일을 얻었지만 압축을 푸는 데 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 --best
lz4
내 샘플에서는 가까운 초 이며 약간 더 잘 압축되었습니다.
$ 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