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

时间:2012-09-03 05:47:21

标签: performance perl file-io fileslurp

我有一个perl脚本,我写了一个非常大的日志文件。目前我用“传统的”Perl方式写出我的文件:

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

我在阅读文件时听到了很多关于File::Slurp的好消息,以及它如何能够大大改善运行时。我的问题是,使用File :: Slurp会更快地写出我的日志文件吗?我问,因为在perl中写出一个文件看起来很简单,我不知道File :: Slurp如何才能真正优化它。

2 个答案:

答案 0 :(得分:8)

File::Slurp主要是一种便利功能。而不是编写通常的openwhile read/writeclose代码,您只有一行read_filewrite_file

但是,我不知道它比你自己的代码更快。它在Perl中编码,而不是在C中编码。同样在使用write_file $file_name, @lines的数组变体的情况下,它对于内存也可能有点低效,因为它在写出之前首先将所有数组行连接成单个标量。 / p>

但是,它确实使用syswrite而不是缓冲写入。它可以安全地执行此操作,因为它是在其生命周期内访问文件句柄的唯一功能。所以是的,由于这个原因可能会更快。

答案 1 :(得分:8)

在某些情况下,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;

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

相关问题