- 论坛徽章:
- 0
|
以前的问题是“问题是这样的,我有一个很大的字符串数据集,按一定规则可以切成块,然后push入数组,大约有40,000,000个元素,现在需要拿一个目的字符串对这个数组进行遍历搜索,利用my $srID=index($array[0],$keyword);判断每个数组元素中是否还有该目的字符串,可是全部4千万个元素遍历完需要时间大约5min左右,时间比较久。。。
如果不用array,用hash的话会不会快一些呢?或者有其他的更快的算法没”
大家的回复我看了一下,可能是我的问题没有描述清楚,下面贴上一小段程序,我的想法是能不能利用多线程,比如单线程的时候4千万个数组元素需要一个一个遍历,如果开4个线程,把数组分成4各部分,每个部分在单独的线程中跑,然后搜索到有关键词的数组元素输出到一个新的数组里,不晓得可行不?我试了一下,按说应该更快才对,但是这样多线程反而比单线程更慢,不晓得什么原因,我是VB转到perl的新手,程序写的不是很好,请各位大神看看是我的思路有问题,还是程序写的问题?或者是线程共享数据没设置好,造成信号阻塞?
#!/usr/bin/perl
use strict;
use threads;
use threads::shared; #share data
use Thread::Semaphore;
my @dbcut:shared=(); #切割后的数据集,有40,000,000个元素
my @keywordseqtem:shared;
my $count:shared=0;
my $max_threads;#多线程数目
my $semaphore=new Thread::Semaphore($max_threads);
my $keyword='bateria';#搜索关键词
##multi-threads processing######################################
#想法是利用多线程,将大数组@dbcut按照启动的线程数切割为几部分,分别在线程中#跑。
my $numthrds=0;#创建的进程数
my $startid =0;
my $endid=-1;
my $numseqsstep=int(($#dbcut+1)/$max_threads);
while(){
if($endid>$#dbcut){
last;
}
$startid =$endid+1;
$endid=$startid+$numseqsstep-1;
$semaphore->down();
my $thread=threads->new(\&cir,$keyword,$startid,$endid);
$thread->detach();
$numthrds=$numthrds+1;
}
################################################
sub cir{
my ($keyword,$startid,$endid)=@_;
for (my $j=$startid;$j<=$endid;$j++){
my $srID=index($dbcut[$j],$keyword);
if ($srID==-1){
print 'No Hitting!'."\n";
}
else{
lock ($count);
$keywordseqtem[$count]=$dbcut[$j];
$count++;
}
}
$semaphore->up();
}
|
|