我有一个perl脚本,我在其中写出了一个非常大的日志文件。目前,我用Perl的“传统”方式写出我的文件:
open FILE, ">", 'log.txt';
print FILE $line;
.....
close FILE;在读取文件时,我听说了很多关于File::Slurp的好消息,以及它是如何极大地改善运行时的。我的问题是,使用File::Slurp会让写出日志文件的速度更快吗?我之所以这样问,是因为用perl写出一个文件看起来非常简单,我不知道File::Slurp如何才能真正优化它。
发布于 2012-09-03 20:03:32
在某些情况下,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;用于输出。特别是在您处理非常大的日志文件的情况下,我认为毫无疑问,您应该坚持使用流式输出方法
发布于 2012-09-03 14:40:41
File::Slurp主要是一个方便的函数。没有编写通常的open、while read/write、close代码,只有一行代码read_file和write_file。
然而,我不知道它是否比你自己的代码更快。它是用Perl语言编写的,而不是用C语言编写的。另外,在使用write_file $file_name, @lines的数组变体的情况下,它在内存方面的效率也可能有点低,因为它首先将所有数组行连接到一个标量中,然后再将标量写出来。
但是,它使用syswrite而不是缓冲写入。它可以安全地这样做,因为它是在文件句柄生命周期中唯一访问文件句柄的函数。因此,是的,它可能会更快。
https://stackoverflow.com/questions/12242599
复制相似问题