Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.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
Perl 并行处理多个文件_Perl - Fatal编程技术网

Perl 并行处理多个文件

Perl 并行处理多个文件,perl,Perl,我有一个Perl脚本,它读取并处理两个文件 第一个文件-info file-I将其存储为散列(3.5 gb) 第二个文件-taregt文件-我正在使用info文件中的信息和设计的其他子程序进行处理。(此文件,目标,范围为30-60 gb) 到目前为止,正在开展的工作有: 将信息文件读入散列 将目标文件拆分为 大块 我想在所有块上并行运行: while(chunks){ # do something sub a {} sub b {} } 所以基本上,我想读一

我有一个Perl脚本,它读取并处理两个文件

第一个文件-info file-I将其存储为散列(3.5 gb)

第二个文件-taregt文件-我正在使用info文件中的信息和设计的其他子程序进行处理。(此文件,目标,范围为30-60 gb)

到目前为止,正在开展的工作有:

  • 将信息文件读入散列
  • 将目标文件拆分为 大块
我想在所有块上并行运行:

while(chunks){
    # do something 

    sub a {}
    sub b {} 
} 
所以基本上,我想读一个块,写它的输出,同时对多个块执行此操作。while循环读取块文件的每一行,并调用各种子例程进行处理

有没有一种方法可以让我在后台读块

我不想为每个块读取信息文件,因为它有3.5gb长,我正在将其读入哈希,每次都会占用3.5gb


现在脚本需要1到2hr来运行30-60GB。

如果并行任务是独立的,可以使用Perl。

3.5GB散列非常大,应该考虑使用数据库来代替。根据您的操作方式,您可以通过散列继续访问数据库

如果内存不是问题,
fork
ing将是最简单的解决方案。但是,这会复制进程,包括散列,并且只会导致不必要的交换

如果你不能释放一些内存,你应该考虑使用< <代码> > <代码>。Perl线程只存在于解释器中,对操作系统不可见。这些线程与

fork
ing有类似的感觉,但是,您可以将变量声明为
:shared
。(您必须
使用threads::shared


查看官方的

关于模块的内容
文件::映射
(内存映射),它可以轻松读取大文件

use strict;
use File::Map qw(map_file);

map_file my $map, $ARGV[0]; # $ARGV[0] - path to your file
# Do something with $map

有大量的过滤和丢弃,因此整个目标文件的输出量约为500MB,操作系统甚至可以在不被询问的情况下读取后台的下一个数据块!你说这个文件是3.5GB,而保存它的哈希值是3.5GB。。。我对此表示严重怀疑。哈希值可能要多出很多GB。一个好的解决方案将完全取决于输入/输出的结构,这是未知的。Chunk是主文件的几行。它不会在后台运行,因为它一次只能读取一个块。进程(分叉)将更好地完成此任务。你能给我指一个关于进程(分叉)的快速教程吗?。谢谢感谢阿蒙和fxzuz的建议。我正在研究线程和文件::Map。我需要的是线程不同的输出。是的,这些块是独立的。我不想走数据库的路,因为我需要关键信息(也不知道它是如何工作的:)