0

我正在阅读超过百万行的百万文件。

但已尝试对某些字符串使用常规表达式替换它们。

我的字符串是(“tiger”,“lion”,“monkey”)并用字符串“animal”替换它们;

我已经使用正则表达式替换

$line =~ s/tiger/animal/g;
$line =~ s/lion/animal/g;
$line =~ s/monkey/animal/g;

处理时,执行过程中需要很多时间。

在这里,我想了解为什么这很慢以及如何以更快的方式解决此问题?

我无法使用任何外部模块来解决此问题。

4

3 回答 3

5

使用正则表达式的“预编译形式”:

my $regex = qr/\b(?:tiger|lion|monkey)\b/;

# in your loop:
$line ~= s/$regex/animal/g;

注意:正则表达式已简化为一个,并且使用了非捕获组(?:...),因为捕获的文本没有用处。此外,还添加了单词锚点(例如,这意味着monkey将匹配但不匹配greasemonkey)。如果您还想替换复数,请s?在最后一个之前添加。\b

但是,这仅关注正则表达式部分:您还谈论其他类型的处理,也许整个过程可以以某种方式进行更改,以便最终更快。

于 2013-01-11T10:47:20.420 回答
0

您也可以这样做而不是 3 个部分。

$line=~s/(tiger|monkey|lion)/animal/g;
于 2013-01-11T10:54:16.480 回答
0

我不清楚“大约超过百万行的百万文件”是什么意思,但是假设您有一百万个文件,每个文件都有一百万行,例如每个 40 个字符。这涉及到 40TB 的信息。

如果数据在硬盘上,以 50MB/s 的速度读取,则读取该数据量需要 40E12/50E6 = 800,000 秒,即仅超过 9 天。

如果您的程序在几个小时内完成,那么您应该非常感激!

于 2013-01-11T12:35:52.383 回答