在这种情况下,习惯上只打开一次文件吗?
#!/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件事:
>是否有其他进程可能需要写入文件?
如果是这样,您可能需要锁定文件,并且为并发使用而设计的进程的良好行为是尽可能快地释放锁定的共享资源,以便其他人可以获得锁定.
>您需要打开多个文件?
如果是这样,您可能会用尽打开文件太多的文件句柄,因此您需要关闭.
>如果程序崩溃,您有多少容忍丢失文件中的数据.
如果需要将缓冲区中的数据保存到文件中,则需要刷新它.这可以通过频繁关闭来完成,尽管更好的解决方案是在打开文件句柄时频繁刷新或自动刷新.
>您是否非常关心在磁盘空间不足后无法关闭文件?
如果是这样,关闭/重新打开文件的频率越高,由于文件系统已满,您将丢失的数据越少,因此自上次打开以来您写的任何内容都消失了.
在任何其他情况下,只打开/关闭一次(好吧,加上可能在__DIE__处理程序和END {}块中的额外关闭(并且大部分时间,您可能会在其他情况下).
这是因为打开/关闭文件只会毫无理由地浪费系统资源并使代码更长.更具体地说,文件打开和关闭是昂贵的操作,需要两个系统调用(可能强制从用户区跳转到内核),以及额外的磁盘IO,这是非常昂贵的资源.要验证这一点,请在您的操作系统上运行一些系统利用率测量实用程序,并运行Perl脚本,除了打开/关闭10000个不同的文件名,每个脚本不执行任何操作.
请注意(关于方案#3 /#4)如果您非常关心不丢失任何数据,则不应该首先使用文件IO – 使用具有传递保证的数据库或消息传递系统.