.gz 압축 파일의 dos 줄 끝 변환 속도 향상

.gz 압축 파일의 dos 줄 끝 변환 속도 향상

dos 줄 끝이 있는 120개의 .gz 파일(각각 약 5G)이 있고 내 목표는 이를 Unix 줄 끝으로 변환하는 것이지만 며칠을 기다리고 싶지 않습니다.

이것이 나의 현재 접근 방식입니다.

function conv() {
    tmpfile=$(mktemp .XXXXXX)
    zcat $1 > $tmpfile
    dos2unix $tmpfile
    gzip $tmpfile
    mv $tmpfile.gz $1
}



for a in $(ls *.fastq.gz); do
    echo "$a"
    conv "$a" &
done

압축을 풀고 다시 압축하지 않고 줄 끝 부분을 수정하는 방법이 있나요?

답변1

어쨌든 압축을 풀고 압축해야 합니다. 하지만 모든 단계에서 결과를 저장할 필요는 없습니다. 그래서:

set -o noclobber
for file in *.fastq.gz; do
  gzip -d < "$file" | dos2unix | pigz > "$file.new" &&
    mv -- "$file.new" "$file"
done

압축을 위해 한 번에 더 많은 프로세서를 사용 합니다 pigz.

GNU xargs'를 사용하여 -P이러한 파이프라인 중 여러 개를 병렬로 실행할 수도 있습니다.

printf '%s\0' *.fastq.gz |
  xargs -r0 -P4 -n1 sh -o noclobber -c '
    gzip -d < "$1" | dos2unix | gzip > "$1.new" &&
      mv -- "$1.new" "$1"' sh

여기서는 4개를 병렬로 실행합니다. gzip -d, dos2unix및 는 이미 gzip각 파이프라인에서 병렬로 실행되고 있습니다( gzip파이프라인의 병목 현상이 발생할 수 있음). CPU 수를 초과하는 병렬 실행 수가 성능을 저하시킬 수 있습니다. CPU가 빠르거나 스토리지가 느린 경우 I/O가 병목 현상을 일으키고 여러 CPU를 병렬로 실행하면 실제로 성능이 저하된다는 것을 알 수 있습니다.

다시 압축할 때 더 좋고 빠르게 압축하거나 독립적인 청크에서 무작위로 데이터에 액세스하거나 더 빠른 압축 풀기 등 필요에 더 잘 맞는 다른 압축 알고리즘으로 전환할 수 있는 좋은 기회가 될 수 있습니다.

관련 정보