Chinaunix

标题: 求大神指导~~~一个小脚本 为什么运行的这么慢 [打印本页]

作者: albertkingking    时间: 2014-02-20 14:31
标题: 求大神指导~~~一个小脚本 为什么运行的这么慢
写了一个很短的小脚本,处理序列比对结果用的,不知道为什么跑起来非常慢,输入的文本文件大概1G左右,跑了4个小时也没有出结果,求指导,万分感谢!!
脚本如下:
#!/usr/bin/perl -w
open IN, "<$ARGV[0]" or die "$!";
<IN>;
while(<IN>){
    chomp;
    @tmp=split(/\s+/,$_);
    $va=$tmp[4]."\t".$tmp[0]."\t".$tmp[2];
    if(!exists $hash{$tmp[3]}){
        $hash{$tmp[3]}=$va;
    }else{
        $hash{$tmp[3]}=$hash{$tmp[3]}."\n".$va;
    }
}

foreach $key(keys %hash){
    print ">$key\n$hash{$key}\n";
}

输入文件格式如下:
trans_id        trans_coord     target_seq      probe_id        probe_seq       num_mismatch    strand
ch139708    294     TTGCAGGAAAACAAGCTTAACACGCCCAC   n122612_h       TTGCAGGAAAACAAGCTTAAGACGCCCAC   1       +
ch139708    294     TTGCAGGAAAACAAGCTTAACACGCCCACT  n122613_h       TTGCAGGAAAACAAGCTTAACATGCCCACT  1       +
ch139708    294     TTGCAGGAAAACAAGCTTAACACGCCCAC   n122614_h       TTGCAGGAAAACAAGCTTAACATGCCCAC   1       +
ch139708    294     TTGCAGGAAAACAAGCTTAACACGCCCAC   n122615_h       TTGCAGGAAAACAAGCTTAACACGCCCAC   0       +
ch321020    295     TTGCGGGAAAACAAGCTTAACACGCCCAC   n122612_h       TTGCAGGAAAACAAGCTTAAGACGCCCAC   2       +
ch321020    295     TTGCGGGAAAACAAGCTTAACACGCCCACT  n122613_h       TTGCAGGAAAACAAGCTTAACATGCCCACT  2       +
ch321020    295     TTGCGGGAAAACAAGCTTAACACGCCCAC   n122614_h       TTGCAGGAAAACAAGCTTAACATGCCCAC   2       +
ch321020    295     TTGCGGGAAAACAAGCTTAACACGCCCAC   n122615_h       TTGCAGGAAAACAAGCTTAACACGCCCAC   1       +
ch1324427    295     TTGCAGGAAAACAAGCTTAACACGCCCAC   n122612_h       TTGCAGGAAAACAAGCTTAAGACGCCCAC   1       +
ch1324427    295     TTGCAGGAAAACAAGCTTAACACGCCCACT  n122613_h       TTGCAGGAAAACAAGCTTAACATGCCCACT  1       +
ch1324427    295     TTGCAGGAAAACAAGCTTAACACGCCCAC   n122614_h       TTGCAGGAAAACAAGCTTAACATGCCCAC   1       +
ch1324427    295     TTGCAGGAAAACAAGCTTAACACGCCCAC   n122615_h       TTGCAGGAAAACAAGCTTAACACGCCCAC   0       +
ch665615    294     TTGCAGGAAAACAAGCTTAACACGCCCAC   n122612_h       TTGCAGGAAAACAAGCTTAAGACGCCCAC   1       +
ch665615    294     TTGCAGGAAAACAAGCTTAACACGCCCACT  n122613_h       TTGCAGGAAAACAAGCTTAACATGCCCACT  1       +
ch665615    294     TTGCAGGAAAACAAGCTTAACACGCCCAC   n122614_h       TTGCAGGAAAACAAGCTTAACATGCCCAC   1       +
ch665615    294     TTGCAGGAAAACAAGCTTAACACGCCCAC   n122615_h       TTGCAGGAAAACAAGCTTAACACGCCCAC   0       +
ch669024    294     TTGCAGGAAAACAAGCTTAACACGCCCAC   n122612_h       TTGCAGGAAAACAAGCTTAAGACGCCCAC   1       +
ch669024    294     TTGCAGGAAAACAAGCTTAACACGCCCACT  n122613_h       TTGCAGGAAAACAAGCTTAACATGCCCACT  1       +
ch669024    294     TTGCAGGAAAACAAGCTTAACACGCCCAC   n122614_h       TTGCAGGAAAACAAGCTTAACATGCCCAC   1       +
ch669024    294     TTGCAGGAAAACAAGCTTAACACGCCCAC   n122615_h       TTGCAGGAAAACAAGCTTAACACGCCCAC   0       +
ch672430    294     TTGCAGGAAAACAAGCTTAACACGCCCAC   n122612_h       TTGCAGGAAAACAAGCTTAAGACGCCCAC   1       +
ch672430    294     TTGCAGGAAAACAAGCTTAACACGCCCACT  n122613_h       TTGCAGGAAAACAAGCTTAACATGCCCACT  1       +
ch672430    294     TTGCAGGAAAACAAGCTTAACACGCCCAC   n122614_h       TTGCAGGAAAACAAGCTTAACATGCCCAC   1       +
ch672430    294     TTGCAGGAAAACAAGCTTAACACGCCCAC   n122615_h       TTGCAGGAAAACAAGCTTAACACGCCCAC   0       +



作者: q1208c    时间: 2014-02-20 14:39
如果真用你这个脚本, 并且数据有4G的话, 你可能需要32G或更多的内存才能运行.
我猜你的机器正在拼命的 swap 吧?
作者: vinian    时间: 2014-02-20 14:48
本帖最后由 vinian 于 2014-02-20 14:49 编辑

这个   $hash{$tmp[3]}.   会不会太长
然后打印出来很慢

用 哈希数组 试试
作者: albertkingking    时间: 2014-02-20 14:51
机器内存有48G呢,但还是很慢,咋样能快些啊,我不懂为啥4G就得32G内存,我不是学计算机的,而且还是菜鸟,您能不能给我大概解释下,万分谢谢!回复 2# q1208c


   
作者: albertkingking    时间: 2014-02-20 14:53
谢谢! 我看看咋写哈,还不会写数组的hash 回复 3# vinian


   
作者: vinian    时间: 2014-02-20 15:04
本帖最后由 vinian 于 2014-02-20 15:08 编辑

回复 5# albertkingking
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

  4. open my $fh, "<", "$ARGV[0]" or die "$!";
  5. <$fh>;
  6. my %hash;

  7. while(<$fh>){
  8.     chomp;
  9.     my @tmp = split;
  10.     my $va = $tmp[4]."\t".$tmp[0]."\t".$tmp[2];
  11.     push @{$hash{$tmp[3]}}, $va;
  12. }

  13. foreach my $key (keys %hash){
  14.     print ">$key\n";
  15.     for my $item ( @{$hash{$key}} ) {
  16.         print "$item\n";
  17.     }
  18. }
复制代码

作者: albertkingking    时间: 2014-02-20 15:08
这么快就写好了,呃,太感谢了,我好好学习学习{:3_193:} 回复 6# vinian


   
作者: albertkingking    时间: 2014-02-20 15:14
还得再次感谢下,测试了一下,果然一会就出结果了,受教了,太谢谢了{:3_193:} 回复 6# vinian


   
作者: pitonas    时间: 2014-02-20 15:18
{:2_172:}
  1. #!/usr/bin/perl
  2. my %hash; <>;

  3. while (<>) {
  4.     my @tmp = split /\s+/, $_, 6;
  5.     push @{ $hash{ $tmp[3] } }, "$tmp[4]\t$tmp[0]\t$tmp[2]\n";

  6. }

  7. foreach $key ( keys %hash ) {
  8.     print ">$key\n", @{ $hash{$key} };
  9. }
复制代码

作者: q1208c    时间: 2014-02-20 15:21
回复 4# albertkingking

首先, 字符串方式的存储就会放大, 所以, 内存的总量一定大于4G, 然后, hash是每次申请的时候会double的, 所以, 会翻倍更快的.

所以, 你这4G的数据全导完, 估计得20G以上了. 保守点, 32G内存是靠谱的 .



   
作者: albertkingking    时间: 2014-02-20 15:32
{:3_182:} 虽然看不太明白(计算机知识太差了),还是得谢谢谢谢,再谢谢,太感谢了{:3_200:} 回复 10# q1208c


   
作者: albertkingking    时间: 2014-02-20 15:33
{:2_172:} 太谢谢了 哈 万分感谢哈 ~~~~~~回复 9# pitonas


   
作者: qq27898    时间: 2014-02-21 15:28
回复 4# albertkingking


    perl 的效率问题,存入内存的不止文本信息,还有其他信息以确保处理的速度
作者: albertkingking    时间: 2014-03-04 11:19
{:2_172:} 谢谢~~还得多学习回复 13# qq27898


   
作者: 清泉一边    时间: 2014-04-17 21:48
my %hash;
while(<DATA>{
chomp;
($ch,$n,$tar,$key,$pro)=split/\s+/;
$value="$pro"." "."$ch"." "."$tar";
# $hash{$key}=[] unless (exists $hash{$key});
push @{$hash{$key}},$value;
}
foreach $key(keys %hash)
{
print ">$key\n";
@value=(sort @{$hash{$key}});
print join "\n",@value;
print "\n";
回复 1# albertkingking


   
作者: sjdy521    时间: 2014-04-17 22:31
回复 10# q1208c


    换成push @{$hash{$tmp[3]}}, $va;不也一样有这些问题吗。。
作者: kingfighters    时间: 2014-04-18 09:45
减少中间变量?或者是直接重用分割的结果?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2