我有一个 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
我有一个 Perl 脚本,它基本上只是在第二列中对这些数据进行 greps,作为在第一列中查找值的一种方式(然后它对“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"