multithreading - 可以使用线程来提高 Perl 中哈希键匹配的速度吗?

标签 multithreading perl

可以使用线程来提高哈希键匹配的速度吗? 我有一个包含前 100 万个 Alexa 网站的哈希值。将 ~100 个唯一主机与 Alexa 哈希进行匹配所需的时间比我希望的要长得多。什么/哪里是引入线程来加速这件事的最合适的方式/位置?

foreach my $host (keys %unique_hosts) {      
  if ($host =~ /(([\w\-]+)\.([\w\-]+))$/) {
    my $domain = $1;
    $in_alexa++ if /$domain$/ ~~ %alexa_sites;
  }
}

编辑:内存看起来不错。

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 
7533 user      20   0  457m 339m 1676 R 99.0 34.2   0:15.31 bind.pl 

最佳答案

对于每个主机,您将进行一百万次正则表达式匹配。这就是为什么它很慢。

是的,线程可以通过使用未使用的 CPU 核心来提供帮助。但这不是正确的解决方案。

我假设您正在尝试检查 $host 是否是 %alexa_sites 的键或 %alexa_sites 中某个键的子域.

for my $host (keys %unique_hosts) {      
    while (1) {
        if (exists($alexa_sites{$host})) {
           ++$in_alexa;
           last;
        }

        $host =~ s/^[^.]*\.//
           or last;
    }
}

现在您正在执行约 300 次快速哈希查找,而不是 100,000,000 次缓慢的正则表达式匹配。

关于multithreading - 可以使用线程来提高 Perl 中哈希键匹配的速度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24558840/

相关文章:

用于提取链接的 HTML Treebuilder XPath

regex - Perl - 无法去除空行

perl - 从分隔文件中删除列

java - 停放 JAVA 线程会导致释放任何获取的监视器吗

Java客户端/服务器线程快速通信消息时出现空指针异常

Java:多线程同步,导致死锁

regex - 零或一个匹配的 Perl 正则表达式

c++ - C++多线程并发向单个MySQL表插入数据

android - WebView - 线程

perl - Perl 5 的pick-your-own-quotes 运算符的合法分隔符是什么?