【发布时间】:2009-02-10 04:13:03
【问题描述】:
我最近遇到了一种情况,当一些相当大的日志文件超过一定大小时,我需要修剪它们。每个文件中除了最后 1000 行之外的所有内容都会被处理掉,作业由 cron 每半小时运行一次。我的解决方案是简单地遍历文件列表,检查大小并在必要时进行修剪。
for $file (@fileList) {
if ( ((-s $file) / (1024 * 1024)) > $CSize) {
open FH, "$file" or die "Cannot open ${file}: $!\n";
$lineNo = 0;
my @tLines;
while(<FH>) {
push @tLines, $_;
shift @tLines if ++$lineNo < CLLimit;
}
close FH;
open FH, ">$file" or die "Cannot write to ${file}: $!\n";
print FH @tLines;
close FH;
}
这在当前形式下有效,但是对于大型日志文件(尤其是具有 100_000+ 行的日志文件)有很多开销,因为需要读取每一行并在必要时进行移位。
有什么方法可以读取文件的一部分,例如在这种情况下,我希望能够仅访问最后的“CLLimit”行。由于该脚本部署在一个已经过得更好的系统上(想想 Celeron 700MHz 和 64MB RAM),我正在寻找使用 Perl 的更快替代方案。
【问题讨论】:
标签: performance perl file-io