如何在Perl中搜索大型排序文件?

时间:2009-12-22 01:30:35

标签: perl

您能否建议我使用任何CPAN模块搜索大型文件?

该文件是一个大约1500万到2000万行的结构化数据,但我只需要找到大约25,000个匹配的条目,所以我不想将整个文件加载到哈希中。

感谢。

5 个答案:

答案 0 :(得分:6)

Perl非常适合这样做,无需外部模块(来自CPAN或其他地方)。

一些代码:

while (<STDIN>) {
    if (/regular expression/) {
         process each matched line
    }
}

您需要提供自己的regular expression来指定要在文件中匹配的行。匹配后,您需要自己的代码来处理每个匹配的行。

将上述代码放入脚本文件中,并将文件重定向到stdin。

答案 1 :(得分:5)

扫描整个文件可能是最快的方法。您还可以尝试File::Sorted,它将对给定记录进行二进制搜索。在2500万行文件中找到一条记录应该要求每条记录大约15-20次搜索。这意味着要搜索25,000条记录,您只需要大约0.5百万次搜索/比较,相比之下,只需要25,000,000条来天真地检查每一行。

磁盘IO就是这样,你可能想先尝试一下简单的方法,但File :: Sorted是理论上的胜利。

答案 2 :(得分:3)

您不想搜索文件,因此请尽量避免使用它。我们对你的问题知之甚少,但这里有一些我以前遇到的问题,所有这些都试图提前做好工作:

  • 将文件分解为数据库。那可能是SQLite,甚至。
  • 根据您要搜索的数据对文件进行预索引。
  • 缓存先前搜索的结果。
  • 自动提前进行常见搜索。

所有这些交易存储空间都是为了提高速度。其中一些我会设置为隔夜工作,以便他们在上班时为人们做好准备。

您提到您拥有结构化数据,但不再说了。每条线都是完整记录吗?该文件多久更改一次?

答案 3 :(得分:3)

听起来你真的想要一个数据库。考虑SQLite,使用Perl的DBI和DBD :: SQLite模块。

答案 4 :(得分:2)

当您使用while ( <$filehandle> )处理输入文件时,它一次只能获取一行文件(对于循环的每次迭代),因此您不必担心它会堵塞您的内存。使用for循环不是这样,它将整个文件篡改到内存中。使用正则表达式或其他任何内容来查找您要查找的内容并将其放入变量/数组/哈希或将其写入新文件。