2

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

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

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

到目前为止的工作是:

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

我想在所有块上并行运行:

while(chunks){
    # do something 

    sub a {}
    sub b {} 
} 

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

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

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

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

4

3 回答 3

1

What's about module File::Map (memory mapping), it can easy read big files.

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

map_file my $map, $ARGV[0]; # $ARGV[0] - path to your file
# Do something with $map
于 2012-09-11T18:40:41.743 回答
1

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

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

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

请参阅官方Perl 线程教程

于 2012-09-11T17:51:54.740 回答
1

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

于 2012-09-11T17:50:17.953 回答