我有一个perl脚本,它从数据库读取大约50,000行,并将它们存储在散列数组中.标准DBI代码.我宁愿将数据放入可以非常干净地传递给其他代码模块的对象,而不是直接在哈希上工作.我正在阅读的表格中有15多列.我的代码基本上看起来像:
my $db = DBI->connect(); # Just pretend you see a proper DBI connect here
my $resultSet = $db->selectall_arrayref($sql);
$db->disconnect();
# Here's where the problem starts.
my %objects;
for my $row (@{$resultSet}) {
my ($col1, $col2, ..., $col15) = @{$row};
my %inputHash;
$inputHash{col1} = $col1 if $col1;
...
$inputHash{col15} = $col1 if $col15;
my $obj = Model::Object->new(%inputHash);
$objects{$col1} = $obj;
}
return values %objects;
Run Code Online (Sandbox Code Playgroud)
它将东西收集到哈希中以消除选择中的重复.问题开始于评论下面的循环中,"这是问题开始的地方".我在循环中添加了一条消息,为每100个创建的对象记录一行.前100个对象是在5秒内创建的.接下来的100分钟需要16秒.达到300需要30多秒.这是多达9000个对象,需要12分钟以上才能创建100个对象.我认为50,000个对象不足以产生这些问题.
正在创建的Model :: Object是一个具有每个属性的getter和setter的类.它有一个新方法和一个序列化方法(本质上是一个toString)就是这样.这没有逻辑.
我在Windows笔记本电脑上运行ActiveState Perl 5.16,内存为8 GB,i7处理器(3年)和具有合理空间的SSD驱动器.我在具有相同版本Perl的Linux机器上看到过这个,所以我不认为这是硬件.我需要留在AS Perl的5.16.任何有关如何提高性能的建议都将受到赞赏.谢谢.