PIL MemoryError with uWSGI

用PIL库处理图片,作缩略图的时候需要先裁减为正方形,再比例缩小,当裁减时不定报错。


img = img.transform((r,r), Image.EXTENT, area)

#ERROR
File "/usr/local/lib/python2.7/dist-packages/PIL/ImageFile.py", line 231, in load_prepare
    self.im = Image.core.new(self.mode, self.size)
MemoryError

google PIL+MemoryError,主要提到2个可能错误。一个是PIL库本身ctype代码问题,一个是传递裁减范围为负值导致内存问题。仔细检查了一下,都没有异常。后来考虑到上面的代码为创建新图像时内存错误,直接调整了uwsgi参数。

-M -p 2 --no-orphans --logdate --chmod-socket=666 --uid admin --gid admin --limit-as 384 --harakiri 60 --max-requests 2000

[–limit-as]参数从256调整到384,系统恢复正常。

反思查找原因,发现图片文件虽然不大仅3M+,但是该图片像素巨大为4096*5210,将该图片转换为BMP,有60M+。估计库在处理图片裁减时会将jpg文件重新读取为完整位图,再考虑到操作位图消耗和程序本身需要的内存空间,原设定256M限制肯定不足了,需要设定更大。

目前程序运行在一个虚拟机上,内存2G……看来需要尽快切换主机了……

PIL 1.1.7 install on ubuntu

PIL虽然可以通过pip安装,但是不好用,各种调用需要的依赖都没有,需要手动安装。

过程如下


#清除系统上现有库 python版本自行替换
sudo rm -rf /usr/lib/python2.7/site-packages/PIL
sudo rm /usr/lib/python2.7/site-packages/PIL.pth

#安装依赖包
sudo apt-get install libjpeg8 libjpeg8-dev libfreetype6 libfreetype6-dev liblcms1-dev

#下载
wget http://effbot.org/downloads/Imaging-1.1.7.tar.gz
tar -zxvf Imaging-1.1.7.tar.gz
cd Imaging-1.1.7/
python setup.py build_ext -i
sudo python setup.py install

#安装后如果发现安装的包没有正确支持可进行如下操作
sudo ln -s /usr/lib/x86_64-linux-gnu/libfreetype.so /usr/lib/
sudo ln -s /usr/lib/x86_64-linux-gnu/libz.so /usr/lib/
sudo ln -s /usr/lib/x86_64-linux-gnu/libjpeg.so /usr/lib/