Tenho cerca de 500 GB de espaço livre em disco no meu SSD. Estou tentando executar uma operação em 10 arquivos gzipados (cada um com cerca de 25 GB de tamanho). Mas continuo ficando sem armazenamento quando faço isso em um parallel
loop for, pois sort
grava muito temporary files
no mesmo diretório e aparentemente não limpa depois de si mesmo.
Estou tentando pegar aleatoriamente um certo número de linhas desses arquivos.
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 &
Essa operação leva em torno de 1 hora em cada arquivo (quando faço um a um), mas quero fazer em paralelo, pois preciso repetir isso em mais lotes desses arquivos.
Eu realmente não entendo por que você está adotando essa abordagem e suspeito que não funcionaria de qualquer maneira, pois
rand()
não está sendo reinicializado e provavelmente está sempre fornecendo exatamente a mesma saída. Tente:De qualquer forma, a coisa toda parece muito complicada, você pode simplesmente usar
shuf
:Isso selecionará 100 linhas aleatórias de sua entrada. Claro, isso não será um arquivo VCF válido, que requer cabeçalhos. Portanto, se você deseja gerar VCFs válidos, adicione o cabeçalho a cada arquivo e escolha N linhas aleatórias sem cabeçalho:
Ou, melhor, evite escrever texto não compactado: