在Perl中,访问1.6百万行键/值对的最快方法是什么?

Luk*_*ard 0 database perl performance-testing bigdata

我有一个1.6百万行的列表,如下所示:

N123HN  /var/foo/bar/baz/A/Alpha.file.1234.bin
N123HN  /var/foo/bar/baz/A/Alpha.file.1235.bin
N123KL  /var/foo/bar/baz/A/Alpha.file.1236.bin
Run Code Online (Sandbox Code Playgroud)

我有一个Perl脚本,它基本上只是在第二列上查看这些数据,作为在第一列中查找值的一种方式(然后它使用"N123HN"值进行其他魔术等).就像现在一样,我的应用程序花费大约4分钟摄取文件并将其加载到一个巨大的哈希(键/值数组)中.虽然由于显而易见的原因,类似grep的函数本身很慢,但运行此脚本的最慢部分是每次运行时都会大量获取数据.

任何人都有任何聪明的想法如何更快地访问这些数据?由于它只是两列的列表,因此对于此用例,关系数据库似乎非常重要.

我在这里重新编辑原始问题,因为将源代码粘贴到评论框中非常难看.

我用来摄取巨大文件的算法是这样的:

while(<HUGEFILE>)
    {
      # hugefile format:
      # nln N123HN ---- 1 0 1c44f5.4a6ee12 17671854355 /var/foo/bar/baz/A/Alpha.file.1234.bin 0

      next if /^(\s)*$/;      # skip blank lines
      chomp;                  # remove trailing newline characters
      @auditrows = split;     # an array of entire rows, split on whitespace
      my $file_url = $auditrows[7];              # /var/foo/bar/baz/A/Alpha.file.1234.bin 
      my $tapenum  = "$auditrows[1] ";          # N123HN
      $tapenumbers{ $file_url } = $tapenum;      # key   = "/var/foo/bar/baz/A/Alpha.file.1234.bin" 
    }                                           # value = "N123HN"
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 8

4分钟?!?!需要7秒!!!

$ perl -E'say "N${_}HN  /var/foo/bar/baz/A/Alpha.file.$_.bin" for 1..1_600_000;' >file

$ time perl -E'my %h; while (<>) { my ($v,$k) = split; $h{$k}=$v; }' file

real    0m7.620s
user    0m7.081s
sys     0m0.249s
Run Code Online (Sandbox Code Playgroud)

也许你没有足够的内存,它会导致交换?