【问题标题】:When is a write to disk triggered?何时触发写入磁盘?
【发布时间】:2018-11-07 01:17:56
【问题描述】:

在 Python 中,我可以使用f= open(<filename>,<permissions>) 打开一个文件。这将返回一个对象 f,我可以使用 f.write(<some data>) 写入该对象。

如果此时我访问原始最终结果(例如,从终端使用cat),它看起来是空的:Python 存储了我写入对象f 的数据,而不是实际的磁盘文件。如果我随后调用f.close()f 中的数据将保存到磁盘文件中(我可以从其他程序访问它)。

我假设数据被缓冲以改善延迟。但是,如果缓冲的数据增长很多,会发生什么? Python会发起写操作吗?如果是这样,内部细节(影响缓冲区大小的因素是什么?磁盘 I/O 是在 Python 中处理还是由另一个程序/线程处理?Python 是否有可能在写入期间挂起?)将不胜感激。

【问题讨论】:

标签: python python-3.x io cpython disk-io


【解决方案1】:

I/O 缓冲的一般主题已经讨论过很多次(包括从 cmets 链接的问题)。但要回答您的具体问题:

  • 默认情况下,当写入终端(“屏幕”)时,换行符会导致文本通过它刷新。对于所有文件,每次填充时都会刷新缓冲区。 (大型单个写入可能会刷新任何现有的缓冲区内容,然后绕过它。)
  • 缓冲区大小固定,在写入任何数据之前分配; Python 3 不使用 stdio,因此它选择自己的缓冲区大小。 (几 kB 是典型的。)
  • “磁盘 I/O”(真正的内核 I/O,仅在某些特殊情况下(如网络/电源故障)可区分)发生在任何 Python 写入触发刷新的地方。
  • 是的,如果文件是连接繁忙进程的管道、慢速网络上的套接字、特殊设备,甚至是从远程计算机挂载的常规文件,它可能会挂起。

【讨论】:

  • 谢谢。我能问一下您所说的“绕过”到底是什么意思(在编写大型单次写入可能会刷新任何现有的缓冲区内容然后绕过它。)?
  • @Aimery:如果缓冲区半满并且请求写入一个 byte 数组(操作系统本机支持的唯一内容),它是 3 个缓冲区长,最好刷新半缓冲区然后操作系统写入数组,而不是将片段复制到缓冲区中(并进行一次额外的系统调用)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 2013-08-10
  • 2013-01-02
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多