File::Slurp更快地将文件写入perl



我有一个perl脚本,在其中我正在编写一个非常大的日志文件。目前,我用"传统"Perl编写文件:

open FILE, ">", 'log.txt';
print FILE $line;
.....
close FILE;

我听过很多关于File:的好消息:在文件中读取时很迟钝,以及它如何极大地改善运行时。我的问题是,使用File::Slurp会让我的日志文件写得更快吗?我之所以这么问,是因为用perl编写文件看起来很简单,我不知道file::Slurp如何才能真正优化它。

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>;
};

用于输入,或

open my $fh, '>', 'out_file' or die $!;
print { $fh } for @data;

用于输出。特别是在您处理非常大的日志文件的情况下,我认为毫无疑问,您应该坚持流式输出方法

File::Slurp主要是一个方便函数。与编写通常的openwhile read/writeclose代码不同,您只有一行read_filewrite_file

然而,我不知道它比你自己的代码快多少。它是用Perl编码的,而不是用C编码的。此外,在使用write_file $file_name, @lines的数组变体的情况下,它可能在内存方面也有点低效,因为它在写出来之前先将所有数组行连接到一个标量中。

但是,它确实使用syswrite而不是缓冲写入。它可以安全地做到这一点,因为它是在其生命周期内访问文件句柄的唯一函数。因此,是的,它可能会因此而更快。

最新更新