Skip to content

Commit d3f40c0

Browse files
committed
gh-117151: IO performance improvement, increase io.DEFAULT_BUFFER_SIZE to 128k, fix open() to use max(st_blksize, io.DEFAULT_BUFFER_SIZE)
1 parent 42351c3 commit d3f40c0

File tree

3 files changed

+7
-4
lines changed

3 files changed

+7
-4
lines changed

Lib/_pyio.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
valid_seek_flags.add(os.SEEK_HOLE)
2424
valid_seek_flags.add(os.SEEK_DATA)
2525

26-
# open() uses st_blksize whenever we can
27-
DEFAULT_BUFFER_SIZE = 8 * 1024 # bytes
26+
# open() uses max(st_blksize, io.DEFAULT_BUFFER_SIZE) when st_blksize is available
27+
DEFAULT_BUFFER_SIZE = 128 * 1024 # bytes
2828

2929
# NOTE: Base classes defined here are registered with the "official" ABCs
3030
# defined in io.py. We don't use real inheritance though, because we don't want
@@ -249,7 +249,7 @@ def open(file, mode="r", buffering=-1, encoding=None, errors=None,
249249
pass
250250
else:
251251
if bs > 1:
252-
buffering = bs
252+
buffering = max(bs, DEFAULT_BUFFER_SIZE)
253253
if buffering < 0:
254254
raise ValueError("invalid buffering size")
255255
if buffering == 0:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Increase ``io.DEFAULT_BUFFER_SIZE`` from 4k/8k to 128k. Adapt :func:`open` on Linux to use
2+
``max(io.DEFAULT_BUFFER_SIZE, device block size)`` rather than the device block
3+
size. Improve I/O performance upto 3 to 5 times. Patch by Romain Morotti.

Modules/_io/_iomodule.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ extern Py_ssize_t _PyIO_find_line_ending(
7878
*/
7979
extern int _PyIO_trap_eintr(void);
8080

81-
#define DEFAULT_BUFFER_SIZE (8 * 1024) /* bytes */
81+
#define DEFAULT_BUFFER_SIZE (128 * 1024) /* bytes */
8282

8383
/*
8484
* Offset type for positioning.

0 commit comments

Comments
 (0)