sortとawkに関連するパイプがファイルからランダムな行を取得している間、ディスクにあまりにも多くのファイルを書き込んで、最終的に使用できないストレージが原因で失敗します。

sortとawkに関連するパイプがファイルからランダムな行を取得している間、ディスクにあまりにも多くのファイルを書き込んで、最終的に使用できないストレージが原因で失敗します。

SSDには約500GBの空きディスク容量があります。 10個のgzipファイル(それぞれ約25GBのサイズ)に対してジョブを実行しようとしています。ただし、forループでこれを行うと、多くのエントリがparallel同じディレクトリに書き込まれ、それ自体がクリーンアップされないため、ストレージ容量が不足します。sorttemporary files

このファイルから任意の行数を取得しようとしています。

bcftools view "${FILES[i]}".vcf.gz | awk '{printf("%f\t%s\n",rand(),$0);}' | sort -t $'\t' -T . -k1,1g | head -n "${SUBSET_COUNT[i]}" | cut -f 2- >> "${FILES[i]}"_"${SUBSET_COUNT[i]}"_subset.vcf &

これはファイルごとに約1時間かかりますが(連続して実行する場合)、そのファイルのより多くのバッチに対して繰り返す必要があるため、並行して実行したいと思います。

ベストアンサー1

私はなぜこのアプローチをとるのか本当に理解していません。rand()再初期化されず、おそらく常に正確に同じ出力を提供するので、とにかく動作しないと思います。試してみてください:

 $ for i in {1..10}; do awk -v i=$i 'BEGIN{print "Try "i",rand="rand()}'; done
Try 1,rand=0.924046
Try 2,rand=0.924046
Try 3,rand=0.924046
Try 4,rand=0.924046
Try 5,rand=0.924046
Try 6,rand=0.924046
Try 7,rand=0.924046
Try 8,rand=0.924046
Try 9,rand=0.924046
Try 10,rand=0.924046

とにかくすべてが複雑すぎるようです。以下を使用できますshuf

bcftools view file.vcf.gz | shuf -n 100 > newfile.vcf

これにより、入力から100行がランダムに選択されます。もちろん、これは有効なVCFファイルではなく、ヘッダが必要です。したがって、有効なVCFを生成するには、各ファイルにヘッダーを追加してから、ヘッダーではなくN行をランダムに選択します。

zgrep '^#' file.vcf.gz > newfile.vcf &&
zgrep -v '^#' file.vcf.gz | shuf -n 100 >> newfile.vcf

あるいは、圧縮されていないテキストを書かない方が良いでしょう。

zgrep '^#' file.vcf.gz | bgzip > newfile.vcf.gz &&
zgrep -v '^#' file.vcf.gz | shuf -n 100 | bgzip >> newfile.vcf.gz

おすすめ記事