Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 为多线程拆分数组_Arrays_Perl_For Loop - Fatal编程技术网

Arrays 为多线程拆分数组

Arrays 为多线程拆分数组,arrays,perl,for-loop,Arrays,Perl,For Loop,我有一个脚本,我在一个大数组中加载,一次加载超过300万个值 我可以很容易地用“for”来浏览列表,它工作得很好,而且很干净。但是为了加快我的脚本速度,我想知道是否可以将主数组自动拆分为X个其他数组,并在for循环中运行每个数组(可能每个都在单独的线程中) 我希望数组是灵活的,所以我可以选择4,它将把它分成4个数组。我将使用Paralel::Queue和threads。您也可以使用另一个mmodules或fork,但在线程中共享数据要比在进程之间共享数据容易得多 我认为你的问题在于你的线程代码,

我有一个脚本,我在一个大数组中加载,一次加载超过300万个值

我可以很容易地用“for”来浏览列表,它工作得很好,而且很干净。但是为了加快我的脚本速度,我想知道是否可以将主数组自动拆分为X个其他数组,并在for循环中运行每个数组(可能每个都在单独的线程中)


我希望数组是灵活的,所以我可以选择4,它将把它分成4个数组。

我将使用Paralel::Queue和threads。您也可以使用另一个mmodules或fork,但在线程中共享数据要比在进程之间共享数据容易得多

我认为你的问题在于你的线程代码,你先创建了数组,然后创建了线程。这样,每个线程都会复制阵列。使用队列向线程发送数据要高效得多

有关其他方法,请参见此处的一些示例:


显而易见的方法是跨线程共享大数组,但是如果该数组是通过从文件中读取数据来填充的,那么您也可以让每个线程自己读取自己的块。处理此数组的结果是什么?它是另一个同样大的数组,还是类似于
42
?基本上,它是整个/8块ip地址的16777214项。。这是很多;-;,当我尝试使用线程或分叉时。似乎只是使用“for”instaid的fork或threads工作得更快,服务器资源也更低⁴ 价值观您在
for
循环中使用它们做什么?最好是显示线程化代码并询问为什么它的性能没有更好,但请记住,只有当进程中有部分可以并行完成时,线程才会更快—最常见的情况是一个线程正在计算,而另一个线程正在写入磁盘。如果只有CPU密集型的工作要做,而您的
for
循环正在以最快的速度推动处理器,那么线程唯一的区别就是增加了将作业拆分的开销。好的,当使用线程时,它使用了三个核中的27%,获得了10Gigs的ram,而只有一个for循环使用了一个核中的3%,和358mb内存。而线程版本则更慢?对我来说,这听起来是个糟糕的交易!我不知道Perl线程是否擅长跨处理器共享工作。您需要显示您的代码。
use strict;
use warnings;

use threads;
use Thread::Queue;

my $q = Thread::Queue->new();    # A new empty queue
my $num_of_threads=4;
# Worker thread creation
my @thrs = threads->create(sub {
                            while (my $item = $q->dequeue()) {
                                return 1 if $item eq 'STOP_TH';
                                process_item($item);
                            }
                         }) for 1..$num_of_threads;

### you are reading your data in loop
while (..){
  ### put data into threads queue
  $q->enqueue(@items);
}
### signal the threads that you have no more data
$q->enqueue('STOP_TH') for 1..$num_of_threads;
### wait until all threads finish
$_->join() for @thrs;

sub process_item {
  my $item = shift;
  ### do whatever you like with item

}