并行处理多个文件

时间:2012-09-11 17:36:41

标签: perl

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

第一个文件 - 信息文件 - 我将其存储为哈希(3.5 gb)

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

到目前为止工作的是:

  • 将信息文件读入哈希
  • 将目标文件分解为 块

我希望并行运行所有块:

while(chunks){
    # do something 

    sub a {}
    sub b {} 
} 

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

有没有办法可以在后台阅读块?

我不想为每个块读取信息文件,因为它长3.5gb,而我正在读取哈希值,每次占用3.5gb。

现在脚本需要1到2小时才能运行30-60gb。

3 个答案:

答案 0 :(得分:1)

如果并行任务是独立的,您可以尝试使用Perl threads

答案 1 :(得分:1)

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

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

如果你无法释放一些记忆,你应该考虑use threads。 Perl线程仅存在于解释器内部,并且对操作系统不可见。这些线程与fork具有相似的感觉,但是,您可以将变量声明为:shared。 (你必须use threads::shared

查看官方Perl threading tutorial

答案 2 :(得分:1)

什么是模块File::Map(内存映射),它可以轻松读取大文件。

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

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