【问题标题】:Is it bad to open() and close() in a loop if speed isn't an issue?如果速度不是问题,那么循环中的 open() 和 close() 是否不好?
【发布时间】:2011-07-12 03:03:48
【问题描述】:

我修改了另一个程序员的 Perl 脚本,用于使其输出日志。 perl 脚本遍历文件,对于它通过的每个文件,我打开()日志,写入/打印到它,然后关闭()它。这种情况经常发生。我这样做是为了确保如果 Perl 脚本挂起,我不会丢失任何数据(它最终会开始这样做,而且我没有足够的知识来修复它)。因此,除了在该循环中重复 open() 和 close() 之外,我没有很好的选择。

我的主要问题是:Perl 脚本是供个人使用的,因此速度降低不是问题。但是,这种可能不恰当地使用打开/关闭是否会导致其他不好的事情发生?这听起来像是一个愚蠢的问题,但这是否会更快地磨损我的硬盘,还是我误解了文件处理的工作原理?

提前致谢。

【问题讨论】:

    标签: perl


    【解决方案1】:

    正如其他人所提到的,除了性能(可以说是代码的清洁度)之外,这里没有其他问题。

    但是,如果您只是担心“Perl 挂掉会丢失数据”,只需在文件句柄上设置 autoflush:

    use IO::Handle;
    open HANDLE, '>log.txt'
        or die "Unable to open log.txt for writing: $!";
    HANDLE->autoflush(1);
    

    现在每个printHANDLE 都会自动刷新。无需一直打开和关闭。

    perldoc man page 中搜索“autoflush”以获取更多信息。

    【讨论】:

    • 谢谢,我肯定会用这个。我不知道这种“自动保存”功能是如何命名的,所以谷歌搜索有点困难。
    【解决方案2】:

    理论上,通常最好尽快打开和关闭连接,文件也不例外。您将遇到的两件事是文件锁定和性能。

    如果其他人同时访问您的文件,则可能会发生文件锁定。

    正如您所提到的,性能并不是一个大问题。

    无论如何,我们并不是在谈论等待打开/关闭操作的生命周期......它在高并发或数十万个操作时最明显。

    【讨论】:

    • 谢谢你们!我希望我可以选择你的两个答案,但是耶稣拉莫斯的答案有一些关于如果脚本在打开文件时崩溃会发生什么的细节,我也想知道。
    • 尼莫的回答是最好的回答。
    • 后来发的,我提前选了拉莫斯的回答。
    【解决方案3】:

    操作系统决定了硬盘访问,所以你应该没问题。如果您需要打开()和关闭()很多文件,那没关系。唯一可能发生的情况是,如果您的脚本挂起(出于某种奇怪的原因),而它具有来自 open() 的文件指针,如果在您手动编辑后恢复,它可能会导致数据丢失(但这是一种非常罕见的情况)。此外,如果您的脚本崩溃,那么描述符无论如何都会被释放,所以据我所知没有问题。

    【讨论】:

    • 我使用的是 Windows 7;如果我每隔一两周打开()和关闭()一个文件大约 100.000 次,是否有增加硬盘磨损的风险?
    • 并非如此,操作系统会缓冲您的请求以减少驱动器的磨损。显然,如果您的驱动器旋转更多时间会导致磨损,但可以忽略不计。
    • 不是立即,如果您在短时间内执行多次关闭,操作系统将创建请求,以便驱动器磁头朝一个方向移动并且磨损最少,因此 100k 刷新可以降低到1/5 甚至更少的请求
    猜你喜欢
    • 2011-11-24
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 2021-11-13
    • 2011-08-27
    • 1970-01-01
    • 2011-05-04
    相关资源
    最近更新 更多