]> granicus.if.org Git - python/commit
bpo-31993: Do not allocate large temporary buffers in pickle dump. (#4353)
authorOlivier Grisel <olivier.grisel@ensta.org>
Sat, 6 Jan 2018 15:18:54 +0000 (16:18 +0100)
committerSerhiy Storchaka <storchaka@gmail.com>
Sat, 6 Jan 2018 15:18:54 +0000 (17:18 +0200)
commit3cd7c6e6eb43dbd7d7180503265772a67953e682
tree7f09aaed6d17611ef6904591525d74de89f854e9
parent85ac726a40707ae68a23d568c322868e353217ce
bpo-31993: Do not allocate large temporary buffers in pickle dump. (#4353)

The picklers do no longer allocate temporary memory when dumping large
bytes and str objects into a file object. Instead the data is
directly streamed into the underlying file object.

Previously the C implementation would buffer all content and issue a
single call to file.write() at the end of the dump. With protocol 4
this behavior has changed to issue one call to file.write() per frame.

The Python pickler with protocol 4 now dumps each frame content as a
memoryview to an IOBytes instance that is never reused and the
memoryview is no longer released after the call to write. This makes it
possible for the file object to delay access to the memoryview of
previous frames without forcing any additional memory copy as was
already possible with the C pickler.
Lib/pickle.py
Lib/pickletools.py
Lib/test/pickletester.py
Lib/test/test_pickletools.py
Misc/NEWS.d/next/Library/2017-11-10-00-05-08.bpo-31993.-OMNg8.rst [new file with mode: 0644]
Modules/_pickle.c