aks*_*aks 4 perl performance file-io
我最近提出了一种情况,一旦它们超过一定大小,我需要修剪一些相当大的日志文件.除了每个文件中的最后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;
}
Run Code Online (Sandbox Code Playgroud)
这在当前形式下工作,但是对于大型日志文件(尤其是具有100_000 +行的文件)存在大量开销,因为需要读取每一行并在必要时进行移位.
有没有什么方法可以只读取文件的一部分,例如在这种情况下我希望只能访问最后的"CLLimit"行.由于脚本部署在一个已经看到更好日子的系统上(想想Celeron 700MHz和64MB RAM),我正在寻找使用Perl的更快的替代方案.
我意识到你想要使用Perl,但如果这是一个UNIX系统,为什么不使用"tail"实用程序进行修剪呢?您可以使用非常简单的脚本在BASH中执行此操作:
if [ `stat -f "%z" "$file"` -gt "$MAX_FILE_SIZE" ]; then
tail -1000 $file > $file.tmp
#copy and then rm to avoid inode problems
cp $file.tmp $file
rm $file.tmp
fi
Run Code Online (Sandbox Code Playgroud)
话虽这么说,你可能会发现这篇文章非常有用,如果你已经开始使用Perl了.
| 归档时间: |
|
| 查看次数: |
2093 次 |
| 最近记录: |