[问题] 由两个DNA 数据库搜索相同的DNA 序列

楼主: goodday06 (goodday)   2015-01-19 16:39:55
我有两个DNA database:
database A 有约18 万条序列,每条约500nt
database B 有约5 万条序列,每条约5000nt
我希望让这A、B两个database 互相比对,
以找出A、B两个database中,共有相同20nt 的两笔序列。
我先用 "foreach" 将database A 每条序列分开,
再用 "substr" 每20个nt 搜索 (DNA 的正反股都要搜索)
再用 "foreach" 将database B 的序列逐一检查跟 "substr" 相同者
结果... 我用小一点的database 测试并且估算,
这样用笔电算完,总共要四千天左右 XD
想请教先进们
是否有节省时间的运算方式?
或是换好一点的电脑会算比较快吗?
先谢不吝赐教!!
作者: herculus6502 (金麟岂是池中物)   2015-01-19 18:07:00
让我想到cas9啊…
作者: flu (Crazy Rhythm)   2015-01-19 18:58:00
对DNA sequencing不熟..只是 用cpan module不会比较方便吗?
作者: uper (凤凰城基金会)   2015-01-19 19:51:00
用hash
作者: LiloHuang (十年一刻)   2015-01-19 20:52:00
可以考虑在第一层分开后,将 substr 的结果存在 %hash此时第一层的 %hash 里头就会是摆满著一堆切好的资料然后把第二层的 foreach 直接提到外面去,别弄成巢状my %hash;foreach (@DB_a) {# do substr to put items in %hash}foreach (@DB_b) {if (exists $hash{$_}) {# found!}}从时间复杂度的角度来看,原先的做法至少是 O(n^2)但是其实找寻重复的资料这件事情,不需要弄成巢状假设内存够大,可以使用空间来换时间,就不会跑太久注意当资料量异常大时,你得使用 64bit 的 Perl 直译器附带一提, put items in %hash 是把资料当作 key而不是摆到 value 喔 :) 这点要特别提醒一下如果还嫌太慢要再做更多加速,可再使用平行计算的技巧如果觉得机器太慢,也可考虑租用Google Compute Engine
楼主: goodday06 (goodday)   2015-01-20 09:38:00
多谢! 我再试看看!
作者: LiloHuang (十年一刻)   2015-01-21 21:50:00
更正,时间复杂度至少会是 O(m*n) 两层循环资料数不同

Links booklink

Contact Us: admin [ a t ] ucptt.com