这个bash脚本是处理包含来自多个患者的基因组的压缩.vcf文件的管道的一部分(这意味着文件即使在压缩时也是巨大的,比如3-5GB)。
我的问题是,在运行这个脚本时,我一直没有内存。它正在GCP高的mem VM中运行。
我希望有一种方法来优化内存的使用,这样就不会失败。我调查了一下,但什么也没发现。
#!/bin/bash
for filename in ./*.vcf.gz; do
[ -e "$filename" ] || continue
name=${filename##*/}
base=${name%.vcf.gz}
bcftools query -l "$filename" >> ${base}_list.txt
for line in `cat ${base}_list.txt`; do
bcftools view -s "$line" "$filename" -o ${line}.vcf.gz
gzip ${line}.vcf
done
done发布于 2021-01-21 22:14:15
如果使用bcftools query/view或gzip时内存不足,请在手册中查找可能减少内存占用的选项。在gzip的情况下,您也可以切换到另一个实现。您甚至可以考虑完全切换压缩算法(zstd非常好)。
然而,我有一种感觉,问题可能是for line in `cat ${base}_list.txt`;。整个文件..._list.txt甚至在循环开始之前就被加载到内存中。另外,这样的阅读方式也存在各种各样的问题,比如在空格处分割行,扩展全局(如* )等等。用这个代替:
while read -r line; do
bcftools view -s "$line" "$filename" -o "$line.vcf.gz"
gzip "$line.vcf"
done < "${base}_list.txt"顺便问一下:您确定要追加bcftools query -l "$filename" >> ${base}_list.txt吗?每次执行脚本时,文件${base}_list.txt都会不断增长。考虑使用>而不是>>覆盖文件。
但是,在这种情况下,您可能根本不需要该文件,因为您可以使用该文件:
bcftools query -l "$filename" |
while read -r line; do
bcftools view -s "$line" "$filename" -o "$line.vcf.gz"
gzip "$line.vcf"
done发布于 2021-01-21 22:40:24
您可以尝试在每个文件上使用split (变成一个恒定大小),然后将文件拆分成gzip。
https://stackoverflow.com/questions/65836117
复制相似问题