0

我的输入文件(~5k 行)格式看起来像这样

foo0: users/user1/temp1 users/user2/temp1 4.0
foo1: users/user2/temp1 users/user4/temp2 users/user4/temp1 1.0
foo2: users/user1/temp3 users/user2/temp3 2.0
foo4: users/user4/temp5 users/user2/temp6 users/user1/temp1 users/user3/temp1 4.0

我的脚本需要做的是查看每一行,抓取每条路径,打开文件并根据它检查里面的东西。

例如:对于第 1 行,脚本必须打开user1 .txt 并在 user1.txt 中搜索 temp1 并执行一些操作。然后继续到user2 .txt 并在里面寻找 temp1 并做一些事情。

对于第 2 行:打开users2 .txt 并搜索 temp1;打开users4 .txt 并搜索 temp2;打开users4 .txt 并搜索 temp1。

最快的方法是什么。我目前是一个一个的打开和关闭,这似乎需要很长时间。任何帮助表示赞赏,谢谢!

4

2 回答 2

-1

我会做这样的事情:

#! /usr/bin/perl

use warnings;
use strict;

while ( <> ) { 

    ## Remove last newline character.
    chomp;

    ## Split line with spaces and save paths (all strings but the first and
    ## last one).
    my @paths = split;
    @paths = @paths[ 1 .. $#paths - 1 ];

    ## For each path...
    for my $path ( @paths ) { 

        ## Split with a slash, get second field and try to open it. 
        my @elements = split m|/|, $path;
        open my $fh, q|<|, $elements[1] or die $!; 

        ## Read line by line searching for the third field of the path, do
        ## something if found. You can add a 'last' instruction if you wish.
        while ( my $line = <$fh> ) { 
            chomp;
            if ( $line =~ m/\Q${elements[2]}\E/ ) { 
                ## Do something;
            }   
        }   

        close $fh or warn $!; 
    }   
}
于 2012-08-21T21:48:48.757 回答
-2

好吧,在普通系统上,硬盘数据传输速度是限制。但是有一些方法可能会给你带来优势:

多线程

如果您担心在此程序运行时您的硬盘可能处于空闲状态,或者您从多个物理驱动器读取数据,您可能需要尝试多线程。您应该注意,这会使您的程序运行速度变慢(a)如果执行错误或(b)如果您的 HDD 读取头必须跳动太多。

  1. 使用函数打开n 个管道,其中n是线程数。pipe
  2. fork 从主(“老板”)线程 n次。
    1. 每个工作线程关闭所有不相关的管道
  3. boss 线程读取您的输入文件并将每个命令依次传递给不同的进程。这样,所有工作进程都有相同的工作量。
  4. 工作线程进行搜索等。

如果您以前没有使用过多线程fork,那么此解决方案将不适合您。

而且,如上所述,这不太可能产生积极的结果,除非您对每个文件的计算成本很高(当进行计算/搜索的时间与阅读时间相当时)如果您的脚本消耗大量 CPU 并且您有多个处理器,这可能会有所帮助。

提出更好的算法

  • 您在每个文件中搜索什么以及如何搜索?您是否只针对每一行匹配一个正则表达式,然后执行一些代码?什么代码?正则表达式是否过于复杂?
  • 您可以使用一些启发式方法来跳过文件的某个部分吗?
  • 你试过Tie::File吗?这样可以避免将文件加载到内存中,这可能会有所帮助。
  • 您是否对脚本进行了基准测试?有关介绍,请参阅perl.com上的本教程。哪些部件运行缓慢?
  • 你能降低程序的算法复杂度吗?即:您是否在任何文件上迭代两次?这可能不是最理想的。
于 2012-08-21T21:58:23.810 回答