區塊配置器

先前的設計

Pillow 中歷史上有兩個影像配置器:ImagingAllocateBlockImagingAllocateArray。第一個適用於小於 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 的最大區塊大小。有效值為整數,並可選擇加上 km 後綴。預設值為 16M。

  • PILLOW_BLOCKS_MAX 指定要保留以填滿未來記憶體請求的釋放區塊數量。超過此門檻的任何釋放區塊都會立即返回作業系統。預設值為 0。