为什么我跑的salmon会占用服务器几百个G的内存呢?

最近学习salmon软件的使用方法,然后小白就踩了一个巨大的坑!

so..夸张了是不?

先放图

话不多说,先来看看我把服务器搞崩的是什么代码呢?

环境搭建

conda create -y -n  rnaseq_salmon python=3
conda activate rnaseq_salmon 
conda install -y salmon fastqc fastp trim_galore
conda install -c hcc aspera-cli 
#https://anaconda.org/hcc/aspera-cli 查看aspera的安装方法

数据准备

参考基因组

下载ensemble数据库的fasta文件

ensemble(human,GRCh38.p13)http://asia.ensembl.org/Homo_sapiens/Info/Index

ftp://ftp.ensembl.org/pub/release-102/fasta/homo_sapiens/dna/

#参考基因组下载方式
wget -c ftp://ftp.ensembl.org/pub/release-102/fasta/homo_sapiens/dna/Homo_sapiens.GRCh38.dna.primary_assembly.fa.gz
#或者可以直接用迅雷下载好,然后上传到服务器上

测试数据

本次测试的数据集是:PRJNA288518

https://www.ebi.ac.uk/ena/browser/home 搜索PRJNA288518

下载相关的下载链接的文件:注意主要需要的是项目样本的SRR编号和aspera的下载链接与其对应的md5值

image-20210208222021651
 

使用aspera下载

#fq文件为数据集中的每一个样本的aspera下载链接(一行只有一个样本链接)
cat fq.txt |while read id
do
ascp -QT -l 300m -P33001  \
-i ~/miniconda3/envs/download/etc/asperaweb_id_dsa.openssh   \
era-fasp@$id  .
done
# nohup bash step1-aspera.sh 1>step1-aspera.log 2>&1 &

#制作md5文件
awk 'NR>1{print $8"}' filereport_read_run_PRJNA229998_tsv.txt | tr ';' '\n' >premd5_1.txt
cat fq.txt | while read id ; do echo "$(basename $id)";done | cat >premd5_2.txt
paste premd5_1.txt premd5_2.txt >md5.txt
#md5值检验(数据所在目录下)
md5sum -c md5.txt

因为我只是需要学习salmon软件的使用,所以下载得到的数据就直接拿来用了,按照一般流程应该是质控后判断是否需要过滤然后才到下面的步骤

salmon 定量

salmon说明书:https://salmon.readthedocs.io/en/latest/salmon.html

构建salmon index

salmon index -t Homo_sapiens.GRCh38.dna.primary_assembly.fa -i hg38_index
#nohup salmon index -t Homo_sapiens.GRCh38.dna.primary_assembly.fa -i hg38_index >hg38_index.log &

salmon定量

#制作salmonID文件
#一共三列,分别是sampleID fq1 fq2(双端测序)

#批量循环提交任务
salmonID=$1
number1=$2
number2=$3

cat salmonID | while read id 
do 
 arr=($id)
 sample=${arr[0]}
 fq1=${arr[1]}
 fq2=${arr[2]}
 if  ((i%$number1==$number2))
 then
                echo "Processin sample ${sample}"
          salmon quant -i /home/xrshen/database/reference/index/salmon/hg38_index \
          -l A  \
          --gcBias  \
          -1 $fq1 -2 $fq2 \
   -p 5 \
          -o /home/xrshen/gse141372/mapping/salmon/${sample}_quant
 fi
 i=$((i+1))
done >salmon.sh
#一共20个样本,那就分4次提交任务(每个任务包含5个子任务)
#nohup bash salmon.sh salmonID 4 0 >0.log &
#nohup bash salmon.sh salmonID 4 1 >1.log &
#nohup bash salmon.sh salmonID 4 2 >2.log &
#nohup bash salmon.sh salmonID 4 3 >3.log &

 

内存占比蹭蹭升上去了!!!

没一会,服务器的内存全被我的salmon代码吃掉了,最后导致内存资源的严重占用!

这时,曾老师突然在微信发我了开始的那张图片,服务器怎么被我搞成这个样子了?

我马上准备登录服务器想着强制杀死全部进程,可这时偏偏不巧——我竟然登录不上我自己的服务器?!(或许网络原因?)

于是只好通过健明老师,联系服务器的管理人员最后才得以停止我用户的后台进程

在和健明老师的讨论过程中,意识到了第一个问题,我第一跑salmon的代码竟然没有测试,直接就用数据集直接跑,是这次踩的第一个坑!(正确做法:不能直接一上来就循环批量提交代码,而是应该用单个的样本数据或者只提交一个循环批量的任务进行验证,本来循环批量提交任务的脚本目的是为了多任务并行提高命令的效率)

下一步,开启了小测试,只提交了一个任务nohup bash salmon.sh salmonID 4 0 >0.log &,结果用top命令,查看后台进程,内存占用的百分比还是不断上升,运行20分钟左右竟然达到了40%左右!

于是,将这个问题salmon为什么如此占用内存资源?再次反馈给健明老师

就来到了下面这个对话

 

老师提出问题,可能是我的代码出现了问题,于是我换个数据集跑(因为之前用其他的数据集跑过,也是出现了内存占用的问题,于是又使用了本次的数据集,还是老问题

最终健明老师考虑是我的构建的index出现了问题

我考虑的点是我的脚本代码写的有没有问题,结果偏偏是index出现了问题!

于是老师,发来了这张图!

 

一目了然对不对,我的index文件竟然有62G

找到了问题的源头,我继续尝试解决(解决问题,必须要知道问题的核心是什么)

如果是同样的参考基因组序列fa文件那么salmon index的差距为何如此之大?

问题就出在参考基因组上,我竟然用的是dnafa文件,这里应该用的是cdnafa文件

下面就简单了,重新建一个index文件!

#ftp://ftp.ensembl.org/pub/release-102/fasta/homo_sapiens/cdna/Homo_sapiens.GRCh38.cdna.all.fa.gz
#参考基因组下载方式
wget -c ftp://ftp.ensembl.org/pub/release-102/fasta/homo_sapiens/cdna/Homo_sapiens.GRCh38.cdna.all.fa.gz
#或者可以直接用迅雷下载好,然后上传到服务器上

#salmon index
salmon index -t Homo_sapiens.GRCh38.cdna.all.fa -i hg38_index
#nohup salmon index -t Homo_sapiens.GRCh38.cdna.all.fa -i hg38_index >hg38_index.log &

#给index内所有文件添加可执行权限
cd /home/xrshen/database/reference/index/salmon/hg38_index
chmod 766 *

 

最终我的salmon命令占用内存稳定在1.7%左右,这才是正常的,正如曾老师所说,salmon基本上不耗费内存,辣鸡笔记本电脑都是可以的!

举个例子:其中一个样本的内容

到这里,salmon的坑就全部踩完了,小小总结一下~希望对你有用哈~

  • 在第一次接触一个新软件时,最有效的办法是阅读说明书,但是其中有些参数我们并不经常使用,所以搜索一些教程先大致看一下高频的参数是什么
  • 调试软件参数时尽量使用最少的样本数据进行测试,测试通过后,再循环批量提交任务
  • 比对软件构建索引时注意参考基因组的使用,不同的参考基因组如本次踩坑:cdna 或 dna是不一样的,看软件要求

写在最后,一点小小的感想,学习生信技术的过程,首先需要投入一定的时间,因为你自己掌握的技术是不会欺骗你的,孰能生巧,多掌握基础知识(脚本编程和基础的生物学背景知识),生信技能树平台是你的一个不错的选择~即使你从未接触过生信~

(0)

相关推荐