何时触发写入磁盘?
When is a write to disk triggered?
在Python中,我可以用f= open(<filename>,<permissions>)
打开一个文件。这个 returns 一个对象 f
我可以使用 f.write(<some data>)
.
写入
如果此时我访问原始的 final(例如从终端使用 cat
),它显示为空:Python 存储了我写入对象的数据 f
而不是实际的磁盘文件。如果我随后调用 f.close()
,f
中的数据将保存到磁盘文件中(我可以从其他程序访问它)。
我假设数据被缓冲以改善延迟。但是,如果缓冲数据增长很多会怎样? Python 会发起写入吗?如果是这样,内部细节(什么影响缓冲区大小?磁盘 I/O 是在 Python 内处理还是由另一个 program/thread 处理?是否有机会 Python 挂起在写作期间?)将不胜感激。
I/O 缓冲的一般主题已被多次处理(包括在评论中链接的问题中)。但要回答您的具体问题:
- 默认情况下,当写入终端(“屏幕”)时,换行符会导致文本通过它刷新。对于所有文件,每次填充时都会刷新缓冲区。 (大 单次 写入可能会刷新任何现有的缓冲区内容,然后绕过它。)
- 缓冲区大小固定,在写入任何数据之前分配; Python 3 不使用
stdio
,因此它选择自己的缓冲区大小。 (几 kB 是典型值。)
- “磁盘I/O”(真正的内核I/O,只有在network/power故障等某些特殊情况下才能区分)发生在内 任何 Python 写入都会触发刷新。
- 是的,它可能会挂起,如果文件是一个繁忙进程的管道、慢速网络上的套接字、特殊设备,甚至是从远程计算机安装的常规文件。
在Python中,我可以用f= open(<filename>,<permissions>)
打开一个文件。这个 returns 一个对象 f
我可以使用 f.write(<some data>)
.
如果此时我访问原始的 final(例如从终端使用 cat
),它显示为空:Python 存储了我写入对象的数据 f
而不是实际的磁盘文件。如果我随后调用 f.close()
,f
中的数据将保存到磁盘文件中(我可以从其他程序访问它)。
我假设数据被缓冲以改善延迟。但是,如果缓冲数据增长很多会怎样? Python 会发起写入吗?如果是这样,内部细节(什么影响缓冲区大小?磁盘 I/O 是在 Python 内处理还是由另一个 program/thread 处理?是否有机会 Python 挂起在写作期间?)将不胜感激。
I/O 缓冲的一般主题已被多次处理(包括在评论中链接的问题中)。但要回答您的具体问题:
- 默认情况下,当写入终端(“屏幕”)时,换行符会导致文本通过它刷新。对于所有文件,每次填充时都会刷新缓冲区。 (大 单次 写入可能会刷新任何现有的缓冲区内容,然后绕过它。)
- 缓冲区大小固定,在写入任何数据之前分配; Python 3 不使用
stdio
,因此它选择自己的缓冲区大小。 (几 kB 是典型值。) - “磁盘I/O”(真正的内核I/O,只有在network/power故障等某些特殊情况下才能区分)发生在内 任何 Python 写入都会触发刷新。
- 是的,它可能会挂起,如果文件是一个繁忙进程的管道、慢速网络上的套接字、特殊设备,甚至是从远程计算机安装的常规文件。