.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 -ddos2unixおよびはすでにgzip各パイプラインで並列に実行されています(gzipパイプラインのボトルネックが発生する可能性があります)。 CPU 数を超える並列実行数がパフォーマンスを低下させる可能性があります。 CPUが高速またはストレージが遅い場合、I / Oはボトルネックを引き起こし、複数のCPUを並列に実行すると実際にパフォーマンスが低下することがわかります。

再圧縮するときは、より高速で圧縮したり、独立したチャンクからランダムにデータにアクセスしたり、より高速に解凍したりするなど、ニーズに合った他の圧縮アルゴリズムに切り替えることができます。

関連情報