Bug 3.11.x behavioral, open file buffers not flushed til file closed.
Eryk Sun
eryksun at gmail.com
Sun Mar 5 19:36:54 EST 2023
On 3/5/23, aapost <aapost at idontexist.club> wrote:
>
> If a file is still open, even if all the operations on the file have
> ceased for a time, the tail of the written operation data does not get
> flushed to the file until close is issued and the file closes cleanly.
This is normal behavior for buffered file I/O. There's no timer set to
flush the buffer after operations have "ceased for a time". It
automatically flushes only when the buffer is full or, for line
buffering, when a newline is written.
The default buffer size is based on the raw file object's _blksize
attribute. If st_blksize can't be determined via fstat(), the default
_blksize is 8 KiB.
Here's an example on Linux. In this example, the buffer size is 4 KiB.
>>> f = open('abc', 'w')
>>> os.fstat(f.fileno()).st_blksize
4096
>>> f.buffer.raw._blksize
4096
>>> f.writelines(f'{i}\n' for i in range(50000))
>>> with open('abc') as g: g.readlines()[-1]
...
'49626\n'
>>> pre_flush_size = os.path.getsize('abc')
>>> f.flush()
>>> post_flush_size = os.path.getsize('abc')
>>> post_flush_size - pre_flush_size
2238
Verify that this makes sense, based on what was left in the buffer
prior to flushing:
>>> remaining_lines = 50000 - 49626 - 1
>>> bytes_per_line = 6
>>> remaining_lines * bytes_per_line
2238
More information about the Python-list
mailing list