我有一个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。
答案 0 :(得分:1)
如果并行任务是独立的,您可以尝试使用Perl threads。
答案 1 :(得分:1)
3.5GB散列非常大,你应该考虑使用数据库。根据您的操作方式,您可以通过哈希继续访问数据库。
如果内存不成问题,fork
将是最简单的解决方案。但是,这会重复该过程,包括散列,并且只会导致不必要的交换。
如果你无法释放一些记忆,你应该考虑use threads
。 Perl线程仅存在于解释器内部,并且对操作系统不可见。这些线程与fork
具有相似的感觉,但是,您可以将变量声明为:shared
。 (你必须use threads::shared
)
答案 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