perl - 我应该保持文件打开还是应该经常打开和关闭?

标签 perl file

在这种情况下是否习惯只打开一次文件?

#!/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/

    相关文章:

    arrays - 比较两个数组,删除匹配的项目

    java - 使用java加载和处理非常大的文件

    php - 使用 PHP 创建 .jpg 文件的下载链接

    php - 删除服务器文件

    perl - Perl 的 `foreach` 语句中括号的用途是什么?

    perl - 如何忽略 perl 中的 'Certificate Verify Failed' 错误?

    Perl 处理目录分隔符

    perl - 为什么 perl qx 在 Mojolicious::Lite 中挂起,但在普通程序中却挂起?

    linux - 如何跨不同操作系统使用 Java 保留文件权限?

    javascript - 读取文件并将其存储在javascript中的数组中