Pillow/docs/reference/block_allocator.rst

48 lines
1.9 KiB
ReStructuredText
Raw Normal View History

2017-10-02 14:50:17 +03:00
Block Allocator
===============
Previous Design
---------------
Historically there have been two image allocators in Pillow:
``ImagingAllocateBlock`` and ``ImagingAllocateArray``. The first works
2017-10-02 15:04:27 +03:00
for images smaller than 16MB of data and allocates one large chunk of
2017-10-02 14:50:17 +03:00
memory of ``im->linesize * im->ysize`` bytes. The second works for
large images and make one allocation for each scan line of size
``im->linesize`` bytes. This makes for a very sharp transition
between one allocation and potentially thousands of small allocations,
leading to unpredictable performance penalties around the transition.
New Design
----------
``ImagingAllocateArray`` now allocates space for images as a chain of
blocks with a maximum size of 16MB. If there is a memory allocation
error, it falls back to allocating a 4KB block, or at least one scan
line. This is now the default for all internal allocations.
``ImagingAllocateBlock`` is now only used for those cases when we are
specifically requesting a single segment of memory for sharing with
other code.
Memory Pools
------------
There is now a memory pool to contain a supply of recently freed
blocks, which can then be reused without going back to the OS for a
fresh allocation. This caching of free blocks is currently disabled by
default, but can be enabled and tweaked using three environment
variables:
2017-10-02 15:04:27 +03:00
* ``PILLOW_ALIGNMENT``, in bytes. Specifies the alignment of memory
2017-10-02 14:50:17 +03:00
allocations. Valid values are powers of 2 between 1 and
128, inclusive. Defaults to 1.
* ``PILLOW_BLOCK_SIZE``, in bytes, K, or M. Specifies the maximum
block size for ``ImagingAllocateArray``. Valid values are
integers, with an optional `k` or `m` suffix. Defaults to 16M.
* ``PILLOW_BLOCKS_MAX`` Specifies the number of freed blocks to
retain to fill future memory requests. Any freed blocks over this
threshold will be returned to the OS immediately. Defaults to 0.