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)
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)
也许你没有足够的内存,它会导致交换?
| 归档时间: |
|
| 查看次数: |
418 次 |
| 最近记录: |