2012-08-09 5 views
5

मेरे पास एक Django व्यू है जो अपलोड की गई फ़ाइलों को संभालता है, और जब इसे बार-बार कहा जाता है, तो हम हमेशा स्मृति त्रुटियों से सामना करते हैं। (हम हरोकू पर हैं, इसलिए हमें प्रति वेब डायनो की 512 एमबी मेमोरी मिलती है)।Django: अपलोड की गई फ़ाइलों को कचरा नहीं मिला, जिससे स्मृति समस्याएं

ओवर मेमोरी त्रुटियों से पता चलता है कि प्रत्येक कॉल फ़ाइल के आकार से स्मृति उपयोग को बढ़ाती है, और स्मृति उपयोग कभी वापस नहीं जाता है। मुझे लगता है कि सर्वर इसे Django मॉडल में सहेजने के लिए स्मृति में छवि को पढ़ता है, लेकिन जब यह हो जाता है तो स्मृति को कभी भी रिलीज़ नहीं करता है।

मुझे लगता है कि फ़ंक्शन रिटर्न के बाद जारी होने वाली छवि का संदर्भ होना चाहिए, जिससे छवि को कचरा होने से रोकना चाहिए। लेकिन मैं नहीं सोच सकता कि यह क्या हो सकता है।

def simplified_add_image(request, biz_id): 
    if request.is_ajax(): 
     # the file is stored raw in the request 
     newBI = NewBusinessImage(business_id=biz_id, name=request.GET.get("name"), primary_image=True) 
     newBI.id = uuid.uuid4() 
     newBI.save() 
     uniquename = biz_id + ".." + get_a_uuid() + ".jpg" 

     newBI.original_image.save(uniquename, ContentFile(request.read())) 

     # this starts a series of tasks to process the image into various sizes. 
     # don't think it's the problem because it runs on a separate server, and the 
     # web server is the one that goes over memory 
     tasks.image_meta_task.delay(uniquename, newBI.id) 

     return StockJSONResponse(request, { 
      "success" : True, 
     }) 

मैं वास्तव में किसी भी मदद की सराहना करेंगे:

यहाँ कोड का एक सरलीकृत संस्करण है, जो मुझे यकीन है कि यह एक ही समस्या है बनाने के लिए परीक्षण किया है। आपका बहुत बहुत धन्यवाद!

हम AmazonS3 पर हमारे फ़ाइलें संग्रहीत कर रहे हैं:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage' 
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage' 
STATIC_URL = 'https://s3.amazonaws.com/%s/' % AWS_STORAGE_BUCKET_NAME 
from S3 import CallingFormat 
AWS_CALLING_FORMAT = CallingFormat.SUBDOMAIN 

और यहाँ है NewBusinessImage मॉडल

क्ले

निम्न अतिरिक्त जानकारी है कि टिप्पणी में अनुरोध किया गया था है

class NewBusinessImage(models.Model): id = UUIDField(auto=True,primary_key=True,version=4, default=uuid.uuid4()) business = models.ForeignKey('Business') name = models.CharField(max_length=100) original_image = models.ImageField(upload_to='photos/originals/') thumbnail = models.ImageField(upload_to='photos/thumbnails/') display_image = models.ImageField(upload_to='photos/displays/') enlarged_image = models.ImageField(upload_to='photos/enlarged/') num_views = models.PositiveIntegerField(editable=False, default=0) primary_image = models.BooleanField(default=False) 
+0

क्या इस 'image_meta_task.delay' है? –

+0

यह एक अतुल्यकालिक अजवाइन कार्य है , जो मानक आकार में छवि को संसाधित करने के लिए एक अलग सर्वर (मेरा वेब सर्वर नहीं) पर लॉन्च होता है एस और उन्हें बचाओ। –

+0

यदि यह एक सरलीकृत संस्करण है, तो इसका अर्थ यह है कि यदि आप 'image_meta_task.delay' ड्रॉप करते हैं तो आपके पास स्मृति समस्याएं नहीं हैं? साथ ही, आप फाइलें कहां स्टोर करते हैं? क्या आप सेटिंग्स.py स्टोर सेटिंग्स और 'NewBusinessImage' पोस्ट कर सकते हैं? – danihp

उत्तर

0

Django दस्तावेज़ीकरण के अनुसार यह 2 फ़ाइल अपलोड हैंडलर के साथ जहाजों। मेमोरी और अस्थायी फाइल संचालकों (Link to docs)

आप केवल के लिए सेटिंग FILE_UPLOAD_HANDLERS सेटिंग्स कॉन्फ़िगर हैं शामिल हैं "django.core.files.uploadhandler.TemporaryFileUploadHandler" यह कभी नहीं फ़ाइल स्मृति को बचाने के लिए करना चाहिए और तकनीकी रूप से स्मृति मुद्दों के कारण आपको कभी नहीं ' । इस समय का सामना करना पड़ फिर

एक अन्य विकल्प एक छोटी राशि है कि अपलोड डिस्क पर सीधे जाने के कारण होगा करने के लिए FILE_UPLOAD_MAX_MEMORY_SIZE स्थापित करने के लिए किया जाएगा।

संबंधित मुद्दे