src*_*ulo 5 perl performance file-io fileslurp
我有一个perl脚本,我写了一个非常大的日志文件.目前我用"传统的"Perl方式写出我的文件:
open FILE, ">", 'log.txt';
print FILE $line;
.....
close FILE;
Run Code Online (Sandbox Code Playgroud)
在阅读文件时,我听到了很多关于File :: Slurp的好东西,以及它如何能够大大改善运行时.我的问题是,使用File :: Slurp会更快地写出我的日志文件吗?我问,因为在perl中写出一个文件看起来很简单,我不知道File :: Slurp如何才能真正优化它.
File::Slurp主要是一种便利功能.而不是写平常的open,while read/write,close代码你只有一个行read_file和write_file.
但是,我不知道它比你自己的代码更快.它在Perl中编码,而不是在C中编码.另外,在使用它的数组变体的情况下,write_file $file_name, @lines它对于内存也可能有点低效,因为它在写出之前首先将所有数组行连接成单个标量.
但是,它确实使用syswrite而不是缓冲写入.它可以安全地执行此操作,因为它是在其生命周期内访问文件句柄的唯一功能.所以,是的,由于这个原因可能会更快.
该File::Slurp实用程序可能会在某些情况下,是分数更快的整体比同等的流实现,但是文件I/O是这样比完全基于内存和CPU的速度非常东西慢得多,它几乎总是限制资源.
我从来没有听说任何File::Slurp可以大大改善运行时间的声明,并希望看到这种效果的参考.我认为它是一种更有效的解决方案的唯一方法是,如果程序需要随机访问文件或必须多次读取它.因为数据全部在内存中,所以没有访问任何数据的开销,但在这种情况下,我的偏好Tie::File使得它看起来好像数据全部同时可用,速度影响小,内存开销少得多
事实上,调用可能read_file会使用户的进程看起来慢得多.如果文件非常大,那么读取所有文件并将其拆分成行所花费的时间可能相当于处理开始之前的明显延迟,而打开文件和读取第一行通常看起来是瞬时的
这同样适用于该计划的最后阶段.write_file将数据组合到磁盘块并将其分页到文件的调用将比简单地关闭文件花费更长的时间
通常,传统的流输出方法是优选的.它几乎没有速度影响,并且通过逐步保存数据来避免数据丢失,而不是等到在内存中累积大量数据之后才发现它因为某种原因无法写入磁盘
我的建议是,File::Slurp当你有小文件时,你可以保留使用,随机访问可以显着简化程序代码.即便如此,也没有任何问题
my @data = do {
open my $fh, '<', 'my_file' or die $!;
<$fh>;
};
Run Code Online (Sandbox Code Playgroud)
输入,或
open my $fh, '>', 'out_file' or die $!;
print { $fh } for @data;
Run Code Online (Sandbox Code Playgroud)
输出.特别是在您处理非常大的日志文件的情况下,我认为您应该坚持使用流式输出方法
| 归档时间: |
|
| 查看次数: |
3374 次 |
| 最近记录: |