ブロックアロケータ

以前のデザイン

歴史的に、Pillowには2つの画像アロケータがありました。それはImagingAllocateBlockImagingAllocateArray です。前者は16MB未満のデータを持つ画像に使用され、im->linesize * im->ysize バイトの大きなメモリチャンクを1つ割り当てます。後者は大きな画像に使用され、im->linesize バイトのサイズの各スキャンラインに対して1つの割り当てを行います。これにより、1回の割り当てと潜在的に数千の小さな割り当ての間で非常に急激な移行が発生し、移行時に予測不可能なパフォーマンスの低下につながります。

新しいデザイン

ImagingAllocateArray は、最大サイズが16MBのブロックチェーンとして画像のスペースを割り当てるようになりました。メモリ割り当てエラーが発生した場合、4KBのブロック、または少なくとも1つのスキャンラインを割り当てるフォールバックを行います。これは、現在、すべての内部割り当てのデフォルトです。

ImagingAllocateBlock は、他のコードと共有するために、単一のメモリセグメントを特に要求する場合にのみ使用されるようになりました。

メモリプール

最近解放されたブロックの供給を保持するためのメモリプールがあり、これにより、新しい割り当てのためにOSに戻ることなく再利用できます。この空きブロックのキャッシュは現在デフォルトで無効になっていますが、3つの環境変数を使用して有効化および調整できます。

  • PILLOW_ALIGNMENT、バイト単位。メモリ割り当てのアライメントを指定します。有効な値は、1〜128(両端を含む)の間の2のべき乗です。デフォルトは1です。

  • PILLOW_BLOCK_SIZE、バイト単位、K、またはM単位。ImagingAllocateArray の最大ブロックサイズを指定します。有効な値は整数で、オプションで k または m のサフィックスが付いています。デフォルトは16Mです。

  • PILLOW_BLOCKS_MAX 将来のメモリ要求を満たすために保持する解放されたブロックの数を指定します。この閾値を超える解放されたブロックは、すぐにOSに返されます。デフォルトは0です。