Thursday, 12 September 2013

Django: Request Times Out When Resizing 10,000 Pictures

Django: Request Times Out When Resizing 10,000 Pictures

I'm trying to resize pictures stored on my Amazon S3 service by
downloading them on to my EC2 Django Server w/Gunicorn, modifying them and
then sending it back to S3. I'm downloading the pictures via the url
stored in my database, here is my code below to give you a better
understanding:
import urllib
import Image
import os
from boto.s3.connection import S3Connection
from boto.s3.key import Key
def resize(request):
queryset = Pictures.objects.all()
for picture in queryset:
s3_url = picture.url
filename = s3_url.split('/')[-1].split('.')[0]
print filename
download_photo = urllib.urlretrieve(s3_url,
"/home/ubuntu/Desktop/Resized_Images/%s.jpg" % (filename))
downloaded_photo =
Image.open("/home/ubuntu/Desktop/Resized_Images/%s.jpg" %
(filename))
resize_small = downloaded_photo.resize((100, 100), Image.ANTIALIAS)
small_filename = filename + "_small"
print small_filename
resize_small.save("/home/ubuntu/Desktop/Resized_Images/%s.jpg" %
(small_filename))
resize_medium = downloaded_photo.resize((300, 300), Image.ANTIALIAS)
med_filename = filename + "_medium"
print med_filename
resize_medium.save("/home/ubuntu/Desktop/Resized_Images/%s.jpg" %
(med_filename))
os.remove("/home/ubuntu/Desktop/Resized_Images/%s.jpg" % (filename))
bucket_name = settings.BUCKET_NAME
# connect to the bucket
conn = S3Connection(settings.AWS_ACCESS_KEY_ID,
settings.AWS_SECRET_ACCESS_KEY)
bucket = conn.get_bucket(bucket_name)
k = Key(bucket)
k.key = '%s/%s.jpg' % (username, small_filename)
k.set_contents_from_filename("/home/ubuntu/Desktop/Resized_Images/%s.jpg"
% (small_filename))
k.make_public()
os.remove("/home/ubuntu/Desktop/Resized_Images/%s.jpg" %
(small_filename))
j = Key(bucket)
j.key = '%s/%s.jpg' % (username, med_filename)
j.set_contents_from_filename("/home/ubuntu/Desktop/Resized_Images/%s.jpg"
% (med_filename))
j.make_public()
os.remove("/home/ubuntu/Desktop/Resized_Images/%s.jpg" %
(med_filename))
print 'Photos have been resized and sent to the FoodShot S3 Bucket'
return HttpResponse("Success")
When I tried this in development, it worked. On my development server, I
had about 50-60 urls. But on my production server, I have about 10,000
urls of images that I need to download and resize. However the request
keeps timing out, what should I do?

No comments:

Post a Comment