将基因组数据分类并写出文件,python,awk,R data.table速度PK

原意

先来驾驭下这么些习惯用语的背景。

在维基百科的分解里 “My two cents” 或者说它的全体版 “Put my two cents in”
是一个美语的习惯表达,它用在发挥一个人的试探性提出场景下。几乎表达的感到就是,我的提议或意见也就值两分钱,微不足道,你听听就足以了,以标明提议者的礼貌与谦卑,以期减弱那种有争论的见地对被指出人的心思冲击。

位于汉语语境下,大致就是这么一些表明:“以我之浅见,你可能那样会…我有局地不一的见识,说出去大家参考参考…”,都是表述一种坐卧不宁提出不一致见解的办法。

那本是一种令人更不难接受提出的语言技巧,但对此分裂角色的人,越发是像总老董这么的角色,其效能兴许就变了味。

 

图片 1

图片 2

近些年读到一篇瑞典语小说,名叫 《Don’t add your 2
cents》,初一看对那个标题有些纳闷,心想这是什么样看头啊?后来读完小说内容,不仅学会了一个新的匈牙利(Magyarország)语习惯用语,还获得一个很有启示的故事。

 

场景

大家看看公司里周边的一种方案呈报或评审场景,首席执行官可能会出席其中。

员工:
过去几周大家早已做了大气调研和设计,已毕了俺们新的某某方案…啪啦啪啦讲一堆,最后我们看看还有啥提议或意见。

其他人:
象征性的提点意见,最终我们都等着听CEO的理念或者说拍板。

老板:
恩,不错,我欢畅。你们的行事做得很好,然而自己觉着那里,这里,那里还足以这么、这样…完善修改下。

再具体完善下那么些情状,假若我们举报或评审的是一个出品方案,老总可能会说:思路正确,但可以再参考下某个竞品的某某细节。再尝试下某种新的主旋律探索。假设是一个设计方案,总裁可能会说:全体感到不错,也许这么些字体可以再大一些,那边的丙子革命可以再浅一点,等等。

如即使技巧方案吧?恩,产品和设计方案一般能够靠常识性知识来判定,但技术方案不是,它须要特地的学识,所以技术方案老董就很少出席。但就怕老董是有技巧背景的,好多年前也是做技术的。

怀有这几个看法或提议,其实就是
“老板的两分钱”,老总也和任何人一样,不过是在品尝发表一些投机不成熟的投石问路,以期作为参照。然则因为COO的角色差异于其余人,他的
“两分钱” 简单被职工解读成命令,须要被高速执行,职务必达。

最终,老董的 “两分钱” 也许无意间就被放大成了协会的 “好几万”。

先是是awk处理,awk举行的是逐行处理,具有自己的语法,具有很大的得心应手,一行代码解决,用时24S,

反思

从意见我来说,老板的眼光并不一定优于任何人的,毕竟业主也不是全能的,区分只是身价。

假若有朝一日你成了业主,你的看法或意见将不再是仅仅表示个人的意见或意见。在各样正式的反馈或评审会上,你得小心无意公布您自认为的
“两分钱” 个人观点或意见,但这并不意味着主管在如此的场地就不可以公布意见了。

一种更好的契合老董的表明形式,也许是用问题句来代表陈述句,因为老板的陈述句简单被解读成祈使句。用提问题来顶替意见、看法或提出,把团结心中的迷离与题材抛给原来方案的指出人(团队),他们才是索要去找到答案,执行进度并取得最好结果的人。

作为业主,你不必要对具备业务都交给意见或意见,仅仅是因为你可见。
用作业主,你协调偏好的答案可能并不重大,毕竟术业有专攻。

但只要业主觉得自己的视角或意见并不仅是
“两分钱”,那就坚决直接的说出去,那就不再是提出而是命令,那就是总高管娘做出的仲裁,并索要负担裁决的老本与后果。

任什么人,也许都可能不是见仁见智规模的老总娘,不是吧?


写点文字,画点画儿,记录成长弹指间。
微信公众号「瞬之间」,既然遇见,不似乎行。
图片 3

   
用时10.6秒,发现刚刚读完数据,立即就处理和写出了结,处理和写出时间非凡短,因而总体用时较短。

 

接下去是用python,python语言简明,书写方便。由此疾速就贯彻了程序,同样逐行处理,比awk添加了几许细节,只挑出要求的染色体。用时19.9秒。

总结

最后用R语言data.table包举办处理,data.table是data.frame的高等版,在速度上作了很大的改正,然而和awk和python比较,具有优势呢?

 

 

 

 

   
由于基因组数据过大,想进一步用R语言处理担心系统内存不够,因而想着将文件按染色体拆分,发现python,awk,R
语言都可以极度简单快捷的贯彻,那么速度是或不是有距离啊,由此在跑多少个50G的大文件从前,先用了244MB的数量对一一脚本进行测试,并且将其速度进行自查自纠。

图片 4

 1 #!/usr/bin/Rscript
 2 library(data.table)
 3 main <- function(filename,sep){
 4 started.at <- proc.time()
 5 arg <- commandArgs(T)
 6 sep <- arg[1]
 7 inputfile <- arg[2]
 8 dt <- fread(filename,sep=sep,header=T)
 9 chrLst <- lapply(c(1:22,"X","Y"),function(x)paste("chr",x,sep=""))
10 for (chrI in chrLst){
11     outputfile <- paste(filename,"_",chrI,sep="")
12     fwrite(dt[.(chrI),,on=.(chr)],file=outputfile,sep=sep)
13 }
14 cat ("Finished in",timetaken(started.at),"\n")
15 }
16 
17 arg <- commandArgs(T)
18 if (length(arg)==2){
19 sep <- arg[1]
20 filename <- arg[2]
21 main(filename,sep)
22 }else{
23 cat("usage: SplitChr.R sep inputfile eg: SplitChr.R '\\t' test.csv","\n")
24 }

图片 5

 1 #!/usr/bin/python
 2 import sys
 3 import time
 4 def main():
 5     if len(sys.argv)!=3:
 6         print "usage : SplitChr sep inputfile eg: SplitChr ',' test.txt"
 7         exit()
 8     sep=sys.argv[1]
 9     filename=sys.argv[2]
10     f=open(filename,'r')
11     header=f.readline()
12     if len(header.split(sep))<2:
13         print "The sep can't be recongnized !"
14         exit()
15     chrLst=range(1,23)
16     chrLst.extend(["X","Y"])
17     chrLst=["chr"+str(i) for i in chrLst]
18     outputdic={}
19     for chrI in chrLst:
20         output=filename+"_"+chrI
21         outputdic[chrI]=open(output,'w')
22         outputdic[chrI].write(header)
23     for eachline in f:
24         tmpLst=eachline.strip().split(sep)
25         tmpChr=tmpLst[0]
26         if tmpChr in chrLst:
27             outputdic[tmpChr].write(eachline)
28     end=time.clock()
29     print "read: %f s" % (end - start)
30 
31 
32 
33 if __name__=='__main__':
34     start=time.clock()
35     main()

    纵然都是逐行处理,但由上述结果揣度awk内部运转并没有python快,但awk书写一行代码搞定,书写速度快,至于python比data.table慢,揣测原因是R
data.table用C语言写,并且利用四线程写出,hash读取,传地址各样措施优化速度的结果。当然,上述结果仅供参考。

 1 #!/usr/bin/sh
 2 function main()
 3 {
 4 start_tm=date
 5 start_h=`$start_tm +%H`
 6 start_m=`$start_tm +%M`
 7 start_s=`$start_tm +%S`
 8 awk -F $sep '{print $1","$2","$3 >> "'"$inputfile"'""_"$1}' $inputfile
 9 end_tm=date
10 end_h=`$end_tm +%H`
11 end_m=`$end_tm +%M`
12 end_s=`$end_tm +%S`
13 use_tm=`echo $end_h $start_h $end_m $start_m $end_s $start_s | awk '{ print ($1 - $2),"h",($3-$4),"m",($5-$6),"s"}'`
14 echo "Finished in "$use_tm
15 }
16 
17 
18 if [ $# == 2 ]; then
19 sep=$1
20 inputfile=$2
21 main
22 else
23 echo "usage: SplitChr.sh sep inputfile"
24 echo "eg: SplitChr.sh , test.csv"
25 fi

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图