当数据量较大时,用MrBayes进行计算通常是旷日持久的事情,几天甚至几个月。中间如果断电死机什么的发生就很令人发狂了。于是 MrBayes 3.2 svn 版增加了一个断点保存的功能,死机后可以从保存的断点处继续计算。只要在mcmc命令中加入checkfreq=n (n为保存断点间隔的代数)参数即可保存断点;下次从断点继续运算时,在mcmc 命令中加入append=yes参数即可.
碰巧的是,前些天不知道谁把我用来计算的那台服务器的电源碰掉了,我那已经算了20多天的任务啊.....! 想砍人之余又庆幸事前曾经设置了断点保存。可是当我在mcmc 命令中加入append=yes参数以恢复运算时,不幸的事还是发生了,MrBayes报错并停止:A maximum of 2000 characters is allowed on a single line, The longest line of the file xxx contains at least one line with 58000 characters. 当时就有欲哭无泪的感觉啊。稍稍平复一下心情,决定还是从程序的源代码查起吧,希望不是一个与算法有关的大bug(小修小改能搞定,跟算法有关的话短时间就没办法搞了)!拿出错消息grep一下所有的源文件,发现问题在这里:
trunk / src / command.c - 3212 - longestLineLength = LongestLine (fp);
trunk / src / command.c - 3213 - MrBayesPrint ( " %s Longest line length = %d\n " , spacer, longestLineLength);
trunk / src / command.c - 3214 - longestLineLength += 50 ;
trunk / src / command.c - 3215 -
trunk / src / command.c: 3216 : /* check that longest line is not longer than CMD_STRING_LENGTH */
trunk / src / command.c: 3217 : if (longestLineLength >= CMD_STRING_LENGTH - 100 )
trunk / src / command.c - 3218 - {
trunk / src / command.c: 3219 : MrBayesPrint ( " %s A maximum of %d characters is allowed on a single line\n " , spacer, CMD_STRING_LENGTH - 100 );
trunk / src / command.c - 3220 - MrBayesPrint ( " %s in a file. The longest line of the file %s\n " , spacer, inputFileName);
trunk / src / command.c - 3221 - MrBayesPrint ( " %s contains at least one line with %d characters.\n " , spacer, longestLineLength);
trunk / src / command.c - 3222 - nErrors ++ ;
trunk / src / command.c - 3223 - }
trunk / src / command.c - 3224 - # if defined (MPI_ENABLED)
原来最长行的字符数被 CMD_STRING_LENGTH 所限制。grep搜CMD_STRING_LENGTH,在mb.h中找到:
trunk / src / mb.h - 251 -
trunk / src / mb.h - 252 - #define POS_INFINITY 1E25f;
trunk / src / mb.h - 253 - #define NEG_INFINITY -1000000.0f
trunk / src / mb.h - 254 -
trunk / src / mb.h: 255 : #define CMD_STRING_LENGTH 200000
trunk / src / mb.h - 256 -
原来 CMD_STRING_LENGTH 被限制到了20000,该值已经大大不能符合我的数据要求了。于是操刀将其放大10倍,改为200000。重新编译MrBayes, 再次从断点处回复执行, OK,熟悉的计算过程又回来了。20多天的计算总算没白费。