如何解决使用 gzip 和 bcftools 的 Bash 脚本因大文件耗尽内存
这个 bash 脚本是处理压缩 .vcf 文件的管道的一部分,其中包含来自多个患者的基因组(这意味着即使压缩文件也很大,比如 3-5GB)。
我的问题是运行此脚本时内存不足。它正在 GCP 高内存 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
解决方法
如果您在使用 bcftools query
/view
或 gzip
时内存不足,请在手册中查找可能减少内存占用的选项。在 gzip 的情况下,您也可以切换到替代实现。你甚至可以考虑完全切换压缩算法(zstd 很不错)。
但是,我感觉问题可能是for line in `cat ${base}_list.txt`;
。整个文件 ..._list.txt
甚至在循环开始之前就已加载到内存中。此外,以这种方式读取行有各种各样的问题,例如在空白处拆分行,扩展像 *
这样的 glob 等等。改用这个:
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
,
您可以尝试在每个文件上使用 split
(固定大小),然后 gzip 文件拆分。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。