我有一个巨大的日志文件(大约5-10毫线)。我需要遍历每一条线并进行处理。我看到了巨大的运行时。
我知道在perl中读取文件的两种方法,如下所示。
(1)如何比较不同方法的性能?有板凳标记机制吗?
(2),什么是最有效的方法,为什么?有第三种或更好的方法吗?
一个选项是实现这两种方法并检查运行时。但在这里,我试着理解是什么让他们跑得更快或更慢。如果你能在这方面帮助我,我将不胜感激。
方法1
open FOPEN, '<', $file or die $!;
my @lines = <FOPEN>;
chomp @lines;
foreach (@lines) {
# do something on $_
}方法2
open FOPEN, '<', $file or die $!;
while (<FOPEN>) {
chomp;
# do something on $_
}发布于 2013-09-28 12:19:28
方法2是绝对可行的。方法1将整个文件复制到内存中(在变量@行中)。如果您的日志文件大于1GB,则期望您的程序崩溃。方法2将逐行迭代文件,并保持几乎恒定的内存使用量.
希望这能有所帮助。
编辑:(忘记谈论基准部分)
您可以使用像基准测试这样的模块来比较这两种方法在几次迭代中的性能。一个非常方便的工具。您将发现方法2将超过-执行方法1的一个非常大的文件相当大的幅度。
发布于 2013-09-28 12:27:12
除非您需要按顺序处理文件的行,否则一定要在while循环中读取它,因为将整个文件吸收到数组中只是在浪费内存。Perl系统将尽可能高效地缓冲文件,并根据请求从缓冲区中传递每一行数据。
也可能没有必要对每一行进行chomp。字符串末尾的备用换行符不太重要。
根据您想要处理的文件,可能需要对只包含感兴趣信息的较小的文件(或多个文件)的输入进行预处理。
始终使用词法文件句柄,即
open my $fh, '<', $file or die $!;
while (<$fh>) {
# do something on $_
}这与效率无关;这只是良好的做法。
发布于 2013-09-28 18:57:37
如果文件大小很大,并且正在读取整个文件,请考虑使用无阻塞IO执行sysread,在这里可以找到一些示例:15.htm或搜索"perl sysread非阻塞“。
https://stackoverflow.com/questions/19066856
复制相似问题