Automatic memory management for Pillow - take the blue pill
Project description
BluePIL 💊
Take the blue pill. Your memory stays safe.
Stop fighting Pillow's memory leaks. BluePIL is a drop-in replacement that automatically handles cleanup so you don't have to.
The Problem
from PIL import Image
# Process 1000 images
for i in range(1000):
img = Image.open(f'image_{i}.jpg')
img = img.resize((800, 600))
img.save(f'output_{i}.jpg')
# img.close() # Forgot this? RAM goes brrr 📈
Memory usage: 2GB+ and climbing 🔥
Here's the dirty secret: Pillow's Python objects get garbage collected just fine, but the underlying C image buffers don't get freed unless you explicitly call .close(). Python's GC has no idea those massive C allocations even exist.
The result? Your Python process looks lean to the GC while your actual RAM usage spirals out of control. You're forced to either:
- Manually call
.close()everywhere like it's 1995 - Wrap everything in context managers
- Just accept the leak and provision 40GB of RAM (the HuggingFace strategy)
The Solution
from bluepil import Image
# Same code, zero leaks
for i in range(1000):
img = Image.open(f'image_{i}.jpg')
img = img.resize((800, 600))
img.save(f'output_{i}.jpg')
# Automatic cleanup ✨
Memory usage: Stable at 50MB ✅
Installation
pip install bluepil
Usage
Replace your Pillow import:
# Before
from PIL import Image
# After
from BluePIL import Image
That's it. Everything else works exactly the same.
How It Works
BluePIL wraps Pillow's Image class with automatic cleanup using weakref.finalize(). When an image goes out of scope, .close() is called automatically, releasing the C buffers immediately instead of leaking them forever.
Features
- ✅ Drop-in replacement for
PIL.Image - ✅ Zero API changes
- ✅ Automatic memory cleanup
- ✅ Context manager support
- ✅ Works with existing Pillow code
Why "BluePIL"?
"You take the blue pill, the story ends. You wake up in your bed and believe whatever you want to believe."
Take the blue pill. Stop worrying about memory leaks. Just process your images.
License
MIT
Contributing
Issues and PRs welcome at github.com/ewan-m/bluepil
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file bluepil-0.1.0.tar.gz.
File metadata
- Download URL: bluepil-0.1.0.tar.gz
- Upload date:
- Size: 3.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a52b1905858097dbb01b37dd6ab4eb3bbebdd7dc6ee408c1fa84b8aed9c48522
|
|
| MD5 |
f20ea5ce2dbfce593359bb3dab6dea33
|
|
| BLAKE2b-256 |
49f5a58efe4964251e4dd27053996beed33fa3684786311841324d825e6579ec
|
File details
Details for the file bluepil-0.1.0-py3-none-any.whl.
File metadata
- Download URL: bluepil-0.1.0-py3-none-any.whl
- Upload date:
- Size: 3.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4f6783deb9668bd2eb5c8111edba72808c8801810ed2317e2adf13e9471cdaf4
|
|
| MD5 |
3916e351bac5966753ae1c1a5f5fe4b1
|
|
| BLAKE2b-256 |
231dd0636c152a2da2ef7a48ee5b6855043fe422a4d1821b2bcd986ad59cfd15
|