", 'log.txt'; print FILE $line; -6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:35:18 24 4
gpt4 key购买 nike

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

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

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

最佳答案

File::Slurp在某些情况下,实用程序可能总体上比等效的流式实现要快一点,但文件 I/O 比仅基于内存和 CPU 速度的任何东西慢得多,以至于它几乎总是限制资源。

我从未听说过任何声称 File::Slurp可以极大地改善运行时间,并且希望看到对这种效果的引用。我认为它是一个更有效的解决方案的唯一方法是程序需要随机访问文件或必须多次读取它。因为数据一次全部在内存中,所以访问任何数据都没有开销,但在这种情况下,我的首选是 Tie::File这使得数据看起来好像都是同时可用的,速度影响很小,内存开销也少得多

事实上,很可能是对 read_file 的调用。使该过程在用户看来要慢得多。如果文件非常大,那么读取所有文件并将其拆分为行所花费的时间可能会导致处理开始之前的明显延迟,而打开文件并读取第一行通常看起来是瞬时的

这同样适用于程序结束时。调用 write_file ,它将数据组合到磁盘 block 中并将其分页到文件中,这将比简单地关闭文件花费更长的时间

一般来说,传统的流式输出方法更可取。它对速度的影响很小或没有影响,并且通过增量保存数据来避免数据丢失,而不是等到大量数据在内存中积累后才发现由于某种原因无法将其写入磁盘

我的建议是您使用 File::Slurp 进行预订。当您有随机访问可以显着简化程序代码的小文件时。即使这样也没有错

my @data = do {
open my $fh, '<', 'my_file' or die $!;
<$fh>;
};

用于输入,或
open my $fh, '>', 'out_file' or die $!;
print { $fh } for @data;

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

关于performance - File::Slurp 更快地将文件写入 perl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12242599/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com