我有一个perl程序,这是花费巨大的时间。可以有人提出调整选项。
要求
Perl程序在数据库检索后进行一些文件处理,并根据数据库中存在的值进行进一步处理。所以逻辑是在Perl中批量文件处理
my $sql="select KEY,VALUE from TABLEA";
my $sth = $dbh->prepare($sql);
$sth->execute;
while (my @row = $sth->fetchrow_array()) {
$tagdata{@row[0]} = @row[1];
}
TABLEA包含3百万行。现在在perl程序经过如此多的文件处理后,我需要找到给定值的关键字。关键是独一无二的,但价值不是。
所以通过以下逻辑找出关键字。
my @keysfind = grep { $tagdata{$_} eq $value } keys %tagdata;
foreach (@keysfind)
{
并基于@keysfind
完成处理。这个过程需要很长的时间,因为这个(找到密钥)是循环运行的(10万次)。
我试过的选项是
1)使用fetchall_hashref
而不是fetchrow_array
。虽然它快一点,但并不多。
2)而不是散列,将所有这些操作移动到数据库中,即基于值获取密钥,但问题是这个值获取循环运行10万次,这意味着它将具有这些数量的数据库调用,尽管查询将是直截了当。
任何人都可以提出一个更好的方法来处理这个问题。
我怀疑你可以通过*循环*超过数百万个数值来超越数据库查询。但是:优化时,写出两个解决方案,然后进行基准测试性能永远不明显。 – amon 2013-05-02 09:54:19