免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 7708 | 回复: 42
打印 上一主题 下一主题

学渣求学霸帮忙改改作业。。。 [复制链接]

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-11 10:41 |只看该作者 |倒序浏览
是这样的:
两个文本,第一个文本格式:
  1. >scaffold16 36.5
  2. AATTTTCGCTGGGTTGGGTGTGTCAATTTTTGGCCCAAACACAAACCCACCGTGAGGGTACCCCCGAGTTGCCTTGAGAC
  3. >scaffold35 33.2
  4. GTGTCTTTATATACATATATATGCCGGCTATACTAGATCCTCTTTTATTTTTCGAAAGAAATAGTCTAGCCGTTCGGCTA

复制代码
第二个文本格式:
  1. scaffold16     GLEAN   mRNA    1862    8809    0.997087        -       .
  2. scaffold16     GLEAN   CDS     1862    2248    .       -       0       Parent=P
  3. scaffold16     GLEAN   CDS     2709    2861    .       -       0       Parent=P
复制代码
我现在想根据第二个文本提取第一个文本的字符串,建立哈希使第一个文本“>"行(key)对应下面非">"的字符串(value),然后根据哈希对第二个文本进行处理,第二个文本第一列是key,第四列是起始位置,第五列是终止位置,想得到的是第三列是CDS,对应value的起始位置到终止位置的字符串,存成一个文档后,根据指定的规则转换成新的字符串,每60个字符换行。。。
所以有了下面这个程序:
  1. #!/usr/bin/perl -w
  2. die "Usage: perl $0 gff fq\n" unless @ARGV == 2;

  3. $fIn=$ARGV[1];
  4. $txt=$ARGV[0];

  5. my %seqId;
  6. open (IN,$fIn) or die $!;
  7. my $num=0;
  8. my $seq="";
  9. my $Id=<IN>;
  10. chomp($Id);
  11. my ($id) = ($Id =~ /\>(.*?)\s[0-9.]*/is);
  12. #print $id;

  13. while (<IN>) {
  14.         chomp;
  15.         if (/^>/){
  16.                 $seqId{$id}=$seq;
  17.                 $id=substr($_,1);
  18.                 $id=~s/\s[0-9.]+//g;
  19.                 $seq="";

  20.         }
  21.         else {
  22.                 $seq=$seq.$_;
  23.         }
  24. }
  25. $seqId{$id}=$seq;
  26. close IN;

  27. open (TXT,$txt) or die $!;

  28. while (<TXT>){
  29. chomp;

  30. my($chr,$s,$e,$p)=(split,$_)[0,3,4,2];
  31. $l=$e - $s + 1;
  32. &Sequence_extraction_part($chr,$s,$l,$_,$p);
  33. }

  34. sub Sequence_extraction_part{
  35.         my ($SequenceId,$start,$len,$m,$p)=@_;
  36.         if ($p =~ /CDS/){
  37.         if (exists $seqId{$SequenceId}){
  38.                 open (OUT,">>Sequence_extraction_part.fa");
  39.                 open (AA,">>aa_extraction_part.fa");
  40.                 my $Seq=substr ($seqId{$SequenceId},$start-1,$len);
  41.                 print OUT ">$m\n";
  42.                 print AA  ">$m\n";
  43.                 while($Seq =~ /(.{3})/g) {
  44.                         $aa.=&codon2aa($1);
  45.                 }
  46.                 for ($iii=0;$iii*60<length($Seq);$iii++){
  47.                      print OUT substr($Seq,$iii*60,60),"\n";
  48.                 }
  49.                  for ($i=0;$i*60<length($aa);$i++){
  50.                       print AA substr($aa,$i*60,60),"\n";
  51.                 }
  52.                 $aa="";
  53.         }else{
  54.                 print ("$SequenceId\t$start\t$start+$len\terro\n");
  55.                 close OUT;
  56.         }
  57. }
  58. }
  59. close OUT;
  60. close AA;

  61. sub codon2aa{
  62.         my ($codon)=@_;
  63.            $codon = uc $codon;
  64.          my(%genetic_code) = (
  65.         'TCA' => 'S',    # Serine
  66.         'TCC' => 'S',    # Serine
  67.         'TCG' => 'S',    # Serine
  68.         'TCT' => 'S',    # Serine
  69.         'TTC' => 'F',    # Phenylalanine
  70.         'TTT' => 'F',    # Phenylalanine
  71.         'TTA' => 'L',    # Leucine
  72.         'TTG' => 'L',    # Leucine
  73.         'TAC' => 'Y',    # Tyrosine
  74.         'TAT' => 'Y',    # Tyrosine
  75.         'TAA' => '_',    # Stop
  76.         'TAG' => '_',    # Stop
  77.         'TGC' => 'C',    # Cysteine
  78.         'TGT' => 'C',    # Cysteine
  79.         'TGA' => '_',    # Stop
  80.         'TGG' => 'W',    # Tryptophan
  81.         'CTA' => 'L',    # Leucine
  82.         'CTC' => 'L',    # Leucine
  83.         'CTG' => 'L',    # Leucine
  84.         'CTT' => 'L',    # Leucine
  85.         'CCA' => 'P',    # Proline
  86.         'CCC' => 'P',    # Proline
  87.         'CCG' => 'P',    # Proline
  88.         'CCT' => 'P',    # Proline
  89.         'CAC' => 'H',    # Histidine
  90.         'CAT' => 'H',    # Histidine
  91.         'CAA' => 'Q',    # Glutamine
  92.         'CAG' => 'Q',    # Glutamine
  93.         'CGA' => 'R',    # Arginine
  94.         'CGC' => 'R',    # Arginine
  95.         'CGG' => 'R',    # Arginine
  96.         'CGT' => 'R',    # Arginine
  97.         'ATA' => 'I',    # Isoleucine
  98.         'ATC' => 'I',    # Isoleucine
  99.         'ATT' => 'I',    # Isoleucine
  100.         'ATG' => 'M',    # Methionine
  101.         'ACA' => 'T',    # Threonine
  102.         'ACC' => 'T',    # Threonine
  103.         'ACG' => 'T',    # Threonine
  104.         'ACT' => 'T',    # Threonine
  105.         'AAC' => 'N',    # Asparagine
  106.         'AAT' => 'N',    # Asparagine
  107.         'AAA' => 'K',    # Lysine
  108.         'AAG' => 'K',    # Lysine
  109.         'AGC' => 'S',    # Serine
  110.         'AGT' => 'S',    # Serine
  111.         'AGA' => 'R',    # Arginine
  112.         'AGG' => 'R',    # Arginine
  113.         'GTA' => 'V',    # Valine
  114.         'GTC' => 'V',    # Valine
  115.         'GTG' => 'V',    # Valine
  116.         'GTT' => 'V',    # Valine
  117.         'GCA' => 'A',    # Alanine
  118.         'GCC' => 'A',    # Alanine
  119.         'GCG' => 'A',    # Alanine
  120.         'GCT' => 'A',    # Alanine
  121.         'GAC' => 'D',    # Aspartic Acid
  122.         'GAT' => 'D',    # Aspartic Acid
  123.         'GAA' => 'E',    # Glutamic Acid
  124.         'GAG' => 'E',    # Glutamic Acid
  125.         'GGA' => 'G',    # Glycine
  126.         'GGC' => 'G',    # Glycine
  127.         'GGG' => 'G',    # Glycine
  128.         'GGT' => 'G',    # Glycine
  129.         );
  130.         if(exists $genetic_code{$codon})
  131.         {
  132.         return $genetic_code{$codon};
  133.         }
  134.         else
  135.         {
  136.         return  "Bad codon \"$codon\"!!\n";
  137.                 exit;
  138.                 }
  139. }
复制代码
可是非常非常慢。。对于第一个文本65M,第二个文本3.8M(57021行)的情况下,花了非常久的时间和内存。。。
所以。。。如果。。。大神们可以的话,可以提供一下优化帮助吗?
谢谢谢谢!

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
2 [报告]
发表于 2014-03-11 10:58 |只看该作者
看你的说明, 我进了雾里, 看你的代码, 我掉沟里了.

我现在终于明白有些不喜欢perl而喜欢python的原因了.

给楼主个建议, 第一, 尽可能少用或不用 $_ 这个变量. 虽然没什么不对, 但程序会更可读.
第二, 变量名不要太长, 且尽可能有点意义.
第三, 良好的缩进有助于代码的理解.
第四, 过于专业的内容, 请尽量用功能类似的简单的数据来解释, 对于非专业人士来说, 没多少人能理解你那一串串 "碱基".

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
3 [报告]
发表于 2014-03-11 11:02 |只看该作者
回复 2# q1208c


    好吧。。又让大神们迷惑了。。。。 语言是算命老师教的。。实在抱歉。。。
    其实后面的就是一个hash,我在说明里用“规则转换”定义了。。。sorry。。。and,谢谢大神的建议。。
   现在一个问题是,我真心不知道怎么优化它让它快一点内存小一点

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
4 [报告]
发表于 2014-03-11 11:12 |只看该作者
回复 3# huang6894

我没细看你的代码.

你试着把 在函数中那两个 OPEN  file 挪到外面. 在那个 while 之外打开这两个文件, 函数中只管写入. 在 while 之后 close 这两个 文件. 这样, 可能会好一点.


   

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
5 [报告]
发表于 2014-03-11 11:25 |只看该作者
回复 4# q1208c


    大神v5。。果然快了一点。。。但是内存还是占用太大了。。。而且,感觉处理这么小的文件不应该这么慢才对。。。谢谢大神的建议,谢谢谢谢

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
6 [报告]
发表于 2014-03-11 13:33 |只看该作者
{:2_172:}大神! 这个, 可能会快一点. 但是内存还是占用大了。而且,更大了。{:2_172:}{:2_172:}
不花内存, 内存小一点
scaffold16, scaffold35.... 存成一个, 一个文档
这样, 慢了. 非常久的时间
  1. #!/usr/bin/perl

  2. die "Usage: perl $0 gff fq\n" unless @ARGV == 2;
  3. #@ARGV = qw/cd sca/;
  4. my ( $txt, $fIn ) = @ARGV;
  5. my %code = (
  6.     'TCA' => 'S',    # Serine
  7.     'TCC' => 'S',    # Serine
  8.     'TCG' => 'S',    # Serine
  9.     'TCT' => 'S',    # Serine
  10.     'TTC' => 'F',    # Phenylalanine
  11.     'TTT' => 'F',    # Phenylalanine
  12.     'TTA' => 'L',    # Leucine
  13.     'TTG' => 'L',    # Leucine
  14.     'TAC' => 'Y',    # Tyrosine
  15.     'TAT' => 'Y',    # Tyrosine
  16.     'TAA' => '_',    # Stop
  17.     'TAG' => '_',    # Stop
  18.     'TGC' => 'C',    # Cysteine
  19.     'TGT' => 'C',    # Cysteine
  20.     'TGA' => '_',    # Stop
  21.     'TGG' => 'W',    # Tryptophan
  22.     'CTA' => 'L',    # Leucine
  23.     'CTC' => 'L',    # Leucine
  24.     'CTG' => 'L',    # Leucine
  25.     'CTT' => 'L',    # Leucine
  26.     'CCA' => 'P',    # Proline
  27.     'CCC' => 'P',    # Proline
  28.     'CCG' => 'P',    # Proline
  29.     'CCT' => 'P',    # Proline
  30.     'CAC' => 'H',    # Histidine
  31.     'CAT' => 'H',    # Histidine
  32.     'CAA' => 'Q',    # Glutamine
  33.     'CAG' => 'Q',    # Glutamine
  34.     'CGA' => 'R',    # Arginine
  35.     'CGC' => 'R',    # Arginine
  36.     'CGG' => 'R',    # Arginine
  37.     'CGT' => 'R',    # Arginine
  38.     'ATA' => 'I',    # Isoleucine
  39.     'ATC' => 'I',    # Isoleucine
  40.     'ATT' => 'I',    # Isoleucine
  41.     'ATG' => 'M',    # Methionine
  42.     'ACA' => 'T',    # Threonine
  43.     'ACC' => 'T',    # Threonine
  44.     'ACG' => 'T',    # Threonine
  45.     'ACT' => 'T',    # Threonine
  46.     'AAC' => 'N',    # Asparagine
  47.     'AAT' => 'N',    # Asparagine
  48.     'AAA' => 'K',    # Lysine
  49.     'AAG' => 'K',    # Lysine
  50.     'AGC' => 'S',    # Serine
  51.     'AGT' => 'S',    # Serine
  52.     'AGA' => 'R',    # Arginine
  53.     'AGG' => 'R',    # Arginine
  54.     'GTA' => 'V',    # Valine
  55.     'GTC' => 'V',    # Valine
  56.     'GTG' => 'V',    # Valine
  57.     'GTT' => 'V',    # Valine
  58.     'GCA' => 'A',    # Alanine
  59.     'GCC' => 'A',    # Alanine
  60.     'GCG' => 'A',    # Alanine
  61.     'GCT' => 'A',    # Alanine
  62.     'GAC' => 'D',    # Aspartic Acid
  63.     'GAT' => 'D',    # Aspartic Acid
  64.     'GAA' => 'E',    # Glutamic Acid
  65.     'GAG' => 'E',    # Glutamic Acid
  66.     'GGA' => 'G',    # Glycine
  67.     'GGC' => 'G',    # Glycine
  68.     'GGG' => 'G',    # Glycine
  69.     'GGT' => 'G',    # Glycine
  70. );

  71. open( SCA, $fIn ) or die $!;
  72. my ( $key, %seqId );

  73. while (<SCA>) {
  74.     chomp;
  75.     /^>/ ? ( ($key) = /^>(\w+)/ ) : $seqId{$key} .= $_;
  76. }
  77. close SCA;

  78. open TXT, $txt or die $!;
  79. open OUT, '>', 'Sequence_extraction_part.fa' or die "don't worry";
  80. open AA, '>', 'aa_extraction_part.fa' or die "be happy";

  81. while (<TXT>) {
  82.     my ( $chr, $s, $e, $p ) = ( split /\s+/, $_, 6 )[ 0, 3, 4, 2 ];
  83.     next if $p ne 'CDS';
  84.     my $l = $e - $s + 1;
  85.     extract( $chr, $s, $l, $_ );
  86. }

  87. sub extract {
  88.     my ( $SequenceId, $start, $len, $m ) = @_;
  89.     unless ( exists $seqId{$SequenceId} ) {
  90.         print "$SequenceId\t$start\t$start+$len\terro\n";
  91.         return;
  92.     }

  93.     my $Seq = substr $seqId{$SequenceId}, $start - 1, $len;
  94.     my $aa;
  95.     while ( $Seq =~ /(.{3})/g ) {
  96.         $aa .= $code{$1} || bad_codon($1);
  97.     }
  98.     my ( @OUT, @AA ); # cache 快了, 占内存
  99.     my ( $lenseq, $lenaa ) = ( length($Seq), length($aa) );
  100.     for ( my $j = 0 ; $j * 60 < $lenseq ; $j++ ) {
  101.         push @OUT, substr( $Seq, $j * 60, 60 ), "\n";
  102.     }
  103.     for ( my $i = 0 ; $i * 60 < $lenaa ; $i++ ) {
  104.         push @AA, substr( $aa, $i * 60, 60 ), "\n";
  105.     }
  106.     print OUT ">$m", @OUT;
  107.     print AA ">$m",  @AA;
  108. }

  109. close OUT;
  110. close AA;

  111. sub bad_codon {
  112.     my $bad = shift;
  113.     print qq[Bad codon "$bad"!!\n];
  114.     exit;
  115. }

  116. __DATA__
复制代码

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
7 [报告]
发表于 2014-03-11 13:48 |只看该作者
如果内存还是占用过大, 可能要考虑调整代码的逻辑了.

因为我没办法看懂楼主的实际需求, 所以, 没办法提出调整的建议.

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
8 [报告]
发表于 2014-03-11 13:52 |只看该作者
{:2_172:}  %seqId => big hash (文本65M)

回复 7# q1208c


   

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
9 [报告]
发表于 2014-03-11 13:57 |只看该作者
回复 7# q1208c


    sorry。。。其实我真心不知道怎么说需求。。。谢谢你

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
10 [报告]
发表于 2014-03-11 13:58 |只看该作者
回复 6# pitonas


    非常非常感谢土司大神,学到了一些新的东西,谢谢谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP