Django

2010-03-23 13 views
8

में सभी सेलेरी श्रमिकों/मेमोरी कैश में विश्व स्तर पर सुलभ वस्तुएं मेरे पास 1 सेलेरी कार्य और 5 श्रमिकों के साथ सुंदर मानक Django + Rabbitmq + Celery सेटअप है।Django

कार्य उसी (मैं थोड़ा सा सरल करता हूं) बड़ी फ़ाइल (~ 100 एमबी) असीमित रूप से कई रिमोट पीसी पर अपलोड करता है।

सभी मेमोरी का उपयोग करने के खर्च पर ठीक काम कर रहे हैं, क्योंकि प्रत्येक कार्य/कार्यकर्ता उस बड़ी फ़ाइल को स्मृति में अलग-अलग लोड करता है।

मैं क्या करना चाहता हूं कि किसी प्रकार का कैश, सभी कार्यों के लिए सुलभ हो, यानी केवल एक बार फ़ाइल लोड करें। लोकमैम पर आधारित Django कैशिंग सही होगा, लेकिन दस्तावेज़ीकरण की तरह कहते हैं: "प्रत्येक प्रक्रिया का अपना निजी कैश उदाहरण होगा" और मुझे इस कैश को सभी श्रमिकों के लिए सुलभ करने की आवश्यकता है।

#2129820 में वर्णित सेलेरी सिग्नल के साथ खेलने का प्रयास किया, लेकिन मुझे इसकी आवश्यकता नहीं है।

तो सवाल यह है: क्या कोई तरीका है कि मैं सेलेरी में कुछ वैश्विक परिभाषित कर सकता हूं (जैसे कि कक्षा के आधार पर कक्षा, जहां मैं फ़ाइल या smth लोड कर सकता हूं)। या क्या इस स्थिति में एक Django चाल है जिसका उपयोग मैं कर सकता हूं?

धन्यवाद।

उत्तर

1

ऐसा लगता है कि आपको जो चाहिए वह django के लिए समर्थित मेमकैच है। इस तरह सेलेरी में प्रत्येक कार्य के लिए इसका उपयोग होगा।

+0

मैंने इसके बारे में सोचा, हालांकि memcached में स्टोर करने वाला सबसे बड़ा मूल्य 1 एमबी है। –

+0

फाइल का विभाजन क्यों नहीं करें? और यदि प्रत्येक कार्य को इस फ़ाइल के हर बिट तक पहुंच की आवश्यकता होती है तो हर बार इसे लोड करने से बचने का कोई तरीका नहीं है। –

+0

ठीक है, मुझे उम्मीद है कि यह संभव है :)। विभाजन जटिलता में वृद्धि करेगा और मुझे लगता है कि इससे निपटने के लिए सरल तरीका होना चाहिए। –

0

शायद आप इस विशेष कार्य के लिए प्रक्रियाओं के बजाय धागे का उपयोग कर सकते हैं। चूंकि थ्रेड सभी एक ही मेमोरी साझा करते हैं, इसलिए आपको केवल स्मृति में डेटा की एक प्रति की आवश्यकता होती है, लेकिन आपको अभी भी समानांतर निष्पादन मिलता है। (इसका मतलब है इस कार्य के लिए सेलेरी का उपयोग नहीं करना)

2

क्यों पूरी फ़ाइल को स्मृति में लोड करने के बजाय डिस्क से अपलोड को स्ट्रीम नहीं करना है?

+0

+1 एक सुझाव सुझाव के लिए +1। – knutin