Perl 并行处理多个文件
我有一个Perl脚本,它读取并处理两个文件 第一个文件-info file-I将其存储为散列(3.5 gb) 第二个文件-taregt文件-我正在使用info文件中的信息和设计的其他子程序进行处理。(此文件,目标,范围为30-60 gb) 到目前为止,正在开展的工作有:Perl 并行处理多个文件,perl,Perl,我有一个Perl脚本,它读取并处理两个文件 第一个文件-info file-I将其存储为散列(3.5 gb) 第二个文件-taregt文件-我正在使用info文件中的信息和设计的其他子程序进行处理。(此文件,目标,范围为30-60 gb) 到目前为止,正在开展的工作有: 将信息文件读入散列 将目标文件拆分为 大块 我想在所有块上并行运行: while(chunks){ # do something sub a {} sub b {} } 所以基本上,我想读一
- 将信息文件读入散列
- 将目标文件拆分为 大块
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。我需要的是线程不同的输出。是的,这些块是独立的。我不想走数据库的路,因为我需要关键信息(也不知道它是如何工作的:)