修改 MrBayes 3.2 源码解决不能恢复断点的问题
當(dāng)數(shù)據(jù)量較大時,用MrBayes進(jìn)行計算通常是曠日持久的事情,幾天甚至幾個月。中間如果斷電死機(jī)什么的發(fā)生就很令人發(fā)狂了。于是?MrBayes?3.2 svn 版增加了一個斷點保存的功能,死機(jī)后可以從保存的斷點處繼續(xù)計算。只要在mcmc命令中加入checkfreq=n (n為保存斷點間隔的代數(shù))參數(shù)即可保存斷點;下次從斷點繼續(xù)運算時,在mcmc ?命令中加入append=yes參數(shù)即可.?
碰巧的是,前些天不知道誰把我用來計算的那臺服務(wù)器的電源碰掉了,我那已經(jīng)算了20多天的任務(wù)啊.....! 想砍人之余又慶幸事前曾經(jīng)設(shè)置了斷點保存。可是當(dāng)我在mcmc ?命令中加入append=yes參數(shù)以恢復(fù)運算時,不幸的事還是發(fā)生了,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. ? 當(dāng)時就有欲哭無淚的感覺啊。稍稍平復(fù)一下心情,決定還是從程序的源代碼查起吧,希望不是一個與算法有關(guān)的大bug(小修小改能搞定,跟算法有關(guān)的話短時間就沒辦法搞了)!拿出錯消息grep一下所有的源文件,發(fā)現(xiàn)問題在這里:?
trunk/src/command.c-3211-????/*?find?length?of?longest?line?*/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)
?
原來最長行的字符數(shù)被?CMD_STRING_LENGTH 所限制。grep搜CMD_STRING_LENGTH,在mb.h中找到:
trunk/src/mb.h-250-#define?OMEGA_MAX 1000000.0ftrunk/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,該值已經(jīng)大大不能符合我的數(shù)據(jù)要求了。于是操刀將其放大10倍,改為200000。重新編譯MrBayes, 再次從斷點處回復(fù)執(zhí)行, OK,熟悉的計算過程又回來了。20多天的計算總算沒白費。
?
轉(zhuǎn)載于:https://www.cnblogs.com/agateriver/archive/2010/05/31/1748373.html
總結(jié)
以上是生活随笔為你收集整理的修改 MrBayes 3.2 源码解决不能恢复断点的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle11g远程连接配置 visu
- 下一篇: 公司用的非标普通自动化用单片机还是plc