區塊配置器¶
先前的設計¶
Pillow 中歷史上有兩個影像配置器:ImagingAllocateBlock
和 ImagingAllocateArray
。第一個適用於小於 16MB 資料的影像,並配置一個大小為 im->linesize * im->ysize
位元組的大型記憶體區塊。第二個適用於大型影像,並為每個大小為 im->linesize
位元組的掃描線配置一個區塊。這會在一個配置和可能數千個小型配置之間產生非常明顯的轉換,導致轉換周圍出現不可預測的效能損失。
新的設計¶
ImagingAllocateArray
現在會將影像空間配置為最大大小為 16MB 的區塊鏈。如果發生記憶體配置錯誤,則會退回配置一個 4KB 的區塊,或至少配置一條掃描線。這現在是所有內部配置的預設值。
ImagingAllocateBlock
現在僅用於明確要求單個記憶體區段以便與其他程式碼共用的情況。
記憶體池¶
現在有一個記憶體池來保存最近釋放的區塊供應,然後可以重複使用這些區塊,而無需返回作業系統進行新的配置。目前預設停用免費區塊的快取,但可以使用三個環境變數啟用和調整
PILLOW_ALIGNMENT
,以位元組為單位。指定記憶體配置的對齊方式。有效值是 1 到 128 之間的 2 的冪,包含 1 和 128。預設值為 1。
PILLOW_BLOCK_SIZE
,以位元組、K 或 M 為單位。指定ImagingAllocateArray
的最大區塊大小。有效值為整數,並可選擇加上k
或m
後綴。預設值為 16M。
PILLOW_BLOCKS_MAX
指定要保留以填滿未來記憶體請求的釋放區塊數量。超過此門檻的任何釋放區塊都會立即返回作業系統。預設值為 0。