最近在处理一批数据,10的8次方,处理完毕大概要一个月
,并且这个程序占用的cpu只有一个(我从来没有注意到这个问题啊啊啊)。突然师兄提醒我可以把10的8次方条数据拆成10个10的7次方,作为10条任务并行处理,我艹,三天就跑完了啊,
坑爹呢这是我之前怎么没想到呢混蛋!!以后单任务的程序一定要注意下cpu的使用情况。
并行处理也有个简单的方法,就是把原始文件给切割后提交,让队列调度程序给你并行调度就ok了。大家不要拍砖啊,这个玩意儿还是挺有用处的。
下面这个破脚本,哦,是perl脚本,用来切割文件的。我这里讲某个文件切割成,每4000条数据一个文件,每1000个文件一个文件夹,闲话少说,上酸菜:
Perl代码 #!/usr/bin/perl -w # Program name: filter_pro.pl # Author : bbsunchen # Contact : bbsunchen at gm*il.com # Date : 11/10/2011 # Last Update : 11/10/2011 # Reference : Please cite our following papers when you are using this script. # Description : #=============================================================================================================== use warnings; use strict; use Getopt::Long; use Cwd qw(abs_path); use file::Basename qw(dirname); my %opts; Getoptions(\%opts,"dir:s"); my $usage= <<"USAGE"; Program: $0 input: -dir full path of file OUTPUT: USAGE dIE $usage unless ($opts{dir} && -e $opts{dir}); my $cwd; if ($opts{dir} =~ m{^/}) { $cwd = dirname($opts{dir}); } else { $cwd = dirname(abs_path($opts{dir})); } open DIR, $opts{dir}; my $seq_num = 0; my $Title = ""; my $data = ""; while(<DIR>) { $seq_num++; if($seq_num % 2 != 0) { $Title = $_; next; }else { $data = $_; } my $decIDe_path = 0; if($seq_num % 2 == 0) { $decIDe_path = $seq_num / 2; }else { $decIDe_path = int($seq_num / 2) + 1; } my $file_name = int($decIDe_path / 4000); my $path_name = int($file_name / 1000); my $temp_path = "$cwd/$path_name"; mkdir $temp_path,0775 unless (-e "$temp_path"); dIE $! unless ($opts{dir} && -e $opts{dir}); open OUT, ">> $temp_path/$file_name.fa"; print OUT $Title; print OUT $data; close OUT; } close DIR; 总结以上是内存溢出为你收集整理的并行计算的强大全部内容,希望文章能够帮你解决并行计算的强大所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)