【发布时间】:2020-09-02 19:18:05
【问题描述】:
我正在寻找一种方法来加快我的 perl 执行速度。 我有一个脚本可以读取文件并创建一个 2D 散列(至少有 800 万个键值对)。然后我创建两个单独的哈希,其中包含基于用户输入的二维哈希的第一级和第二级键。但是当我尝试结合所有这些来打印数据时,执行速度非常慢。 这是打印数据的代码块(脚本中最耗时的部分):
open(my $FH_DATA, ">", $report_graph) or die "Cannot open file $!";
print $FH_DATA "$HEADER_GRAPH\n";
foreach my $first_key ( keys %first_level_hash) {
foreach my $second_key (keys %second_level_hash ) {
foreach my $rail (@FILTER_BY_RAILS) {
if( exists $FILTER_BY_RAIL_COMMON{"$first_key.$second_key.$rail"} ) {
print $FH_DATA " $_ " for @{ $my_2D_hash{$first_key}{$second_key} };
print $FH_DATA "$rail $second_key $first_key";
print $FH_DATA "\n";
}
}
}
}
close($FH_DATA);
print "Finished writing $report_graph\n";
这个嵌套的 foreach 循环真的浪费了我的执行时间。我一直在看它,现在变得盲目了。非常感谢任何帮助。
【问题讨论】:
-
输出文件中的顺序重要吗?如果不是,将最外面的两个循环放在 if 语句中会更有意义。 (
for my $rail (...) { if (exists(...)) { for my $first_key (...) { for my $second_key (...) { ... }}}}) -
刚刚发生在我身上...
$cell_key和$pin_key实际上是哈希键? -
很抱歉打错字了。 $pin_key 和 $cell_key 实际上是 $first_key 和 $second 键。我将编辑问题。
-
您是否尝试过使用
each来迭代huge 哈希?while (my ($key, $value) = each %hash) { ... } -
%FILTER_BY_RAIL_COMMON中有多少键?
标签: perl optimization hash