并行计算的强大

来源:互联网 发布:淘宝区域拦截 编辑:程序博客网 时间:2024/05/16 11:43

最近在处理一批数据,10的8次方,处理完毕大概要一个月,并且这个程序占用的CPU只有一个(我从来没有注意到这个问题啊啊啊)。

突然师兄提醒我可以把10的8次方条数据拆成10个10的7次方,作为10条任务并行处理,我艹,三天就跑完了啊,坑爹呢这是我之前怎么没想到呢混蛋!!

 

以后单任务的程序一定要注意下CPU的使用情况。

 

并行处理也有个简单的方法,就是把原始文件给切割后提交,让队列调度程序给你并行调度就ok了。大家不要拍砖啊,这个玩意儿还是挺有用处的。

下面这个破脚本,哦,是perl脚本,用来切割文件的。我这里讲某个文件切割成,每4000条数据一个文件,每1000个文件一个文件夹,闲话少说,上酸菜:

Perl代码  收藏代码
  1. #!/usr/bin/perl -w  
  2. # Program name: filter_pro.pl  
  3. # Author      : bbsunchen  
  4. # Contact     : bbsunchen at gm*il.com  
  5. # Date        : 11/10/2011  
  6. # Last Update : 11/10/2011  
  7. # Reference   : Please cite our following papers when you are using this script.  
  8.   
  9. # Description :   
  10.   
  11. #===============================================================================================================  
  12. use warnings;  
  13. use strict;  
  14. use Getopt::Long;  
  15. use Cwd qw(abs_path);  
  16. use File::Basename qw(dirname);  
  17.   
  18. my %opts;  
  19. GetOptions(\%opts,"dir:s");  
  20. my $usage= <<"USAGE";  
  21.     Program: $0  
  22.     INPUT:  
  23.         -dir        full path of file  
  24.   
  25.     OUTPUT:  
  26. USAGE  
  27. die $usage unless ($opts{dir} && -e $opts{dir});  
  28.   
  29. my $cwd;  
  30. if ($opts{dir} =~ m{^/})  
  31. {  
  32.   $cwd = dirname($opts{dir});  
  33. }  
  34. else  
  35. {  
  36.   $cwd = dirname(abs_path($opts{dir}));  
  37. }  
  38. open DIR, $opts{dir};  
  39. my $seq_num = 0;  
  40. my $title = "";  
  41. my $data = "";  
  42. while(<DIR>)  
  43. {  
  44.     $seq_num++;  
  45.     if($seq_num % 2 != 0)  
  46.     {  
  47.         $title = $_;  
  48.         next;  
  49.     }else  
  50.     {  
  51.         $data = $_;   
  52.     }  
  53.     my $decide_path = 0;  
  54.     if($seq_num % 2 == 0)  
  55.     {  
  56.         $decide_path = $seq_num / 2;   
  57.     }else  
  58.     {  
  59.         $decide_path = int($seq_num / 2) + 1;  
  60.     }  
  61.       
  62.     my $file_name = int($decide_path / 4000);  
  63.     my $path_name = int($file_name / 1000);  
  64.     my $temp_path = "$cwd/$path_name";  
  65.     mkdir $temp_path,0775 unless (-e "$temp_path");  
  66.     die $! unless ($opts{dir} && -e $opts{dir});  
  67.     open OUT, ">> $temp_path/$file_name.fa";  
  68.     print OUT $title;  
  69.     print OUT $data;  
  70.     close OUT;  
  71. }  
  72. close DIR;