在这种情况下是否习惯只打开一次文件?
#!/usr/bin/env perl
use warnings;
use 5.012;
use autodie;
my $file = 'my_file';
open my $fh, '>>', $file;
say $fh "Begin";
close $fh;
$SIG{INT} = sub {
open my $fh, '>>', $file;
say $fh "End";
close $fh;
exit
};
my $result;
while ( 1 ) {
$result++;
# ...
# ...
# ...
open my $fh, '>>', $file;
say $fh $result;
close $fh;
sleep 3;
}
最佳答案
简短回答:几乎总是,您应该只打开/关闭一次。 详情如下。
是否这样做的决定取决于 4 件事:
如果是这样,您可能需要锁定文件,并且为并发使用而设计的进程的良好行为是尽快释放锁定的共享资源,以便其他人可以获得锁定。
如果是这样,您可能会因为打开的文件太多而耗尽文件句柄,因此您需要关闭。
如果需要将缓冲区中的数据保存到文件中,则需要刷新它。这可以通过频繁关闭来完成,尽管更好的解决方案是在打开的文件句柄上频繁刷新或自动刷新。
如果是这样,您关闭/重新打开文件的次数越多,由于文件系统已满而丢失的数据就越少,因此无论您自上次写的内容
open
不见了。 在任何其他情况下,只打开/关闭一次(好吧,加上可能在
__DIE__
处理程序和 END{}
块 中额外关闭(并且大部分时间,您可能会在其他情况下)。那是因为打开/关闭文件只会无缘无故地浪费系统资源,并使您的代码更长。更具体地说,文件打开和关闭是昂贵的操作,需要系统调用(可能会强制从用户空间跳转到内核)和额外的磁盘 IO,这是非常昂贵的资源。要验证这一点,请在您的操作系统上运行一些系统利用率测量实用程序,并运行一个 Perl 脚本,该脚本除了打开/关闭 10000 个不同的文件名 100 次之外什么都不做。
请注意(关于场景 #3/#4),如果您非常关心不丢失任何数据,您首先不应该使用文件 IO - 使用具有交付保证的数据库或消息传递系统。
关于perl - 我应该保持文件打开还是应该经常打开和关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4867468/