这两天技术团队需要对TCGA中的样本提取SNP构建进化树,面对3万多的碱基,mega有点吃力,于是采用了其他的构树工具phyml,但是发现跑的时候莫名其妙的出错。小编看到之后,发现这个问题就是我之前遇到过的问题。样本名字太长,超出内存。不用质疑,生信的很多软件都有这个毛病。
看这篇16年的旧文,希望对大家有所帮助。
生信软件中莫名的错误:段错误
1、什么是段错误
程序运行在内存中;
系统在程序运行之前会在内存中先给程序画出一个空间
这个空间有些来存放代码的;有些来存放运行时的变量,还有些....
这个空间有一个区间使用来存放运行时的变量什么的
段错误 就是程序运行时,变量访问越界一类的问题...
可能出现的原因是:
数组下标越界
动态分配内存的指针被doublefree了(释放两次了)
2、生物信息中常见的段错误
目前针对c语言编写的生信软件,genblastA,codeml,genewise 等都会突然的爆出各种段错误。如果作者程序相对健壮,会告知你那一部分出现了异常。比如codeml,但是更多的情况下就是直接抛出segment default。
很多情况下不清楚为啥会报这个错误。
c语言中定义一个变量,比如说字符串,是要求指定字符串的大小的,比如如果一个字符串的上限为30个字符,那么如果你的文件名,文件路径,或者是基因的id,fa 的id 超过这个上限,就会报错。我们在实际的项目中,有的时间文件名字,或者路径都是很长,基因的id也会很长,这样在运行过程中就会报错。
常见的错误:
1、paml中配置文件的文件目录太深,会报错。找不到文件。
2、Genewise,genblastA中如果文件名,文件路径名,id名太长,会直接抛出段错误。
以genewise为例:
genewise -splice model -init global -gene human.gf -gff -sum -genes -cdna pep.single.ENSGGOP00000001241.2_NW010795405.1-1637954-1727601_Fgene.single.ENSGGOP00000001241.2_NW010795405.1-1637954-1727601_F >genewise.ll
genewise -splice model -init global -gene human.gf -gff -sum -genes -cdna 1.pep 1.gene >genewise.ss
这样就可以跑出来。
我们改一下里面pep的id长度
原来的pep的名字为:
改成
genewise -splice model -init global -gene human.gf -gff -sum -genes -cdna 1.pep 1.gene >genewise.xx
3、如何解决
大家在以后的学习和工作中,如果需要对c语言编写的程序进行二次开发,包装,或者并行等操作的时候,建议对输入的文件进行处理,比如基因的id变短,然后处理完之后再变回来。还有就是尽量不使用绝对路径,使用相对路径。这样会使段错误的出现概率大大减少。
希望可以帮到你。
由于学力有限,书写定有错误,希望大家多多批评指正,共同学习。
更多生信分析需求,请加微信13621202201