हमारे पास एक पायथन आधारित वेब सर्वर है जो cPickle
का उपयोग करके स्टार्टअप पर कई बड़ी डेटा फ़ाइलों को अनपिक करता है। डेटा फाइलें (HIGHEST_PROTOCOL
का उपयोग करके मसालेदार) डिस्क पर लगभग 0.4 जीबी हैं और 1.2 जीबी पायथन ऑब्जेक्ट्स के रूप में मेमोरी में लोड होती हैं - इसमें 20 सेकंड लगता है। हम 64-बिट विंडोज मशीनों पर पायथन 2.6 का उपयोग कर रहे हैं।सीजीकल की तुलना में पाइथन में 1 जीबी ऑब्जेक्ट्स को deserialize कैसे करें?
टोंटी निश्चित रूप से डिस्क नहीं है (यह कम से कम 0.5s लेता है वास्तव में इतना डेटा पढ़ने के लिए), लेकिन स्मृति आवंटन और ऑब्जेक्ट निर्माण (वहाँ बनाया जा रहा वस्तुओं के लाखों रहे हैं)। हम स्टार्टअप समय को कम करने के लिए 20s को कम करना चाहते हैं।
क्या cPickle
(5-10x की तरह) से अधिक तेज़ पाइथन में 1 जीबी से अधिक वस्तुओं को deserialize करने का कोई तरीका है? चूंकि निष्पादन समय स्मृति आवंटन और ऑब्जेक्ट सृजन से बंधे हैं, इसलिए मुझे लगता है कि जेएसओएन जैसी कोई और अनपिक्लिंग तकनीक का उपयोग नहीं करेगा।
मैं कुछ व्याख्या भाषाओं एक डिस्क फ़ाइल के रूप में अपनी पूरी स्मृति छवि बचाने के लिए एक रास्ता है पता है, ताकि वे इसे स्मृति में वापस एक ही बार में सभी लोड कर सकते हैं, बिना प्रत्येक वस्तु के लिए आवंटन/निर्माण। क्या ऐसा करने का कोई तरीका है, या पाइथन में ऐसा कुछ हासिल करना है?
यह एक सॉलिड स्टेट ड्राइव पाने के लिए अपने मौका हो सकता है। क्या यह देव को तेज करने के लिए है? आपको त्वरित तैनाती करने की अनुमति देने के लिए? क्या डेटा पढ़ने या इसे अनपिक करने में अंतराल है? यदि आप एक खाली उदाहरण के साथ शुरू करते हैं, तो स्टार्ट अप टाइम क्या है? – Scott
ध्यान दें कि मैंने अपने प्रश्न में उल्लेख किया है कि बाधा ड्राइव/पढ़ने की गति नहीं है, लेकिन अनपिकलिंग और ऑब्जेक्ट सृजन की गति है। यह त्वरित तैनाती के लिए अधिक है - हमारे सर्वर को जल्दी से पुनरारंभ करने की अनुमति देने के लिए। मुझे पूरा यकीन नहीं है कि आपका मतलब "खाली उदाहरण" से क्या है। –
एक 750MB अचार बाइनरी फ़ाइल के लिए, gc.disable साथ cPickle लोड कॉल()/gc.enable (लपेटकर) काफी कुल समय के आसपास 20x के लिए आवश्यक कम कर दिया। देखें [यहां] (http://stackoverflow.com/a/36699998/2385420) –