微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 gzip 和 bcftools 的 Bash 脚本因大文件耗尽内存

如何解决使用 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/viewgzip 时内存不足,请在手册中查找可能减少内存占用的选项。在 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 文件拆分。

https://man7.org/linux/man-pages/man1/split.1.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?