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

관련 정보