जैरी का अधिकार, अगर यह केवल Ctrl-C है, तो आप चिंतित हैं, आप एक समय में SIGINT को अनदेखा कर सकते हैं। यदि आप सामान्य रूप से प्रक्रिया की मृत्यु के खिलाफ सबूत बनना चाहते हैं, तो आपको किसी प्रकार की न्यूनतम पत्रिका की आवश्यकता है। दो तत्वों को स्वैप करने के लिए:
1) फ़ाइल के अंत में या एक अलग फ़ाइल में नियंत्रण संरचना में एक रिकॉर्ड जोड़ें, यह दर्शाता है कि फ़ाइल के दो तत्व आप स्वैप करने जा रहे हैं, ए और बी
2) ए को स्क्रैच स्पेस पर कॉपी करें, रिकॉर्ड करें कि आपने ऐसा किया है, फ्लश करें।
3) एक से अधिक कॉपी बी, तो खरोंच अंतरिक्ष कि आपने ऐसा किया है, फ्लश
4) बी
5 खरोंच अंतरिक्ष से कॉपी) रिकॉर्ड निकालें में दर्ज करते हैं।
यह सभी व्यावहारिक उद्देश्यों के लिए ओ (1) अतिरिक्त स्थान है, इसलिए अभी भी अधिकांश परिभाषाओं के तहत जगह के रूप में गिना जाता है। सिद्धांत में रिकॉर्डिंग एक इंडेक्स ओ (लॉग एन) है यदि एन मनमाने ढंग से बड़ा हो सकता है: हकीकत में यह बहुत छोटा लॉग एन है, और उचित हार्डवेयर/चलने का समय 64 से ऊपर है।
सभी मामलों में जब मैं कहता हूं " फ्लश ", मेरा मतलब है कि" काफी दूर "परिवर्तन करें। कभी-कभी आपका मूल फ्लश ऑपरेशन केवल प्रक्रिया के भीतर बफर को फ्लश करता है, लेकिन यह वास्तव में भौतिक माध्यम को सिंक नहीं करता है, क्योंकि यह ओएस/डिवाइस ड्राइवर/हार्डवेयर स्तर के माध्यम से सभी तरह से बफर फ्लश नहीं करता है। यह पर्याप्त है जब आप चिंतित हैं, प्रक्रिया की मौत है, लेकिन यदि आप अचानक मीडिया की कमी के बारे में चिंतित हैं तो आपको ड्राइवर के पीछे फ्लश करना होगा। यदि आप बिजली की विफलता के बारे में चिंतित थे, तो आपको हार्डवेयर को सिंक करना होगा, लेकिन आप नहीं हैं। यूपीएस के साथ या यदि आपको लगता है कि बिजली कटौती इतनी दुर्लभ है तो आपको डेटा खोने में कोई फर्क नहीं पड़ता, यह ठीक है।
स्टार्टअप पर, किसी भी "स्वैप-इन-प्रोग्रेस" रिकॉर्ड्स के लिए स्क्रैच स्पेस की जांच करें।यदि आपको कोई मिलता है, तो डेटा को वापस ध्वनि स्थिति में वापस लाने के लिए वहां से कितना दूर मिल गया है और स्वैप को पूरा करें। फिर फिर से अपना सॉर्ट शुरू करें।
स्पष्ट रूप से यहां एक प्रदर्शन समस्या है, क्योंकि आप पहले से रिकॉर्ड के दो बार लिख रहे हैं, और फ्लश/सिंक आश्चर्यजनक रूप से महंगा हो सकता है। व्यावहारिक रूप से आपके इन-प्लेस सॉर्ट में कुछ कंपाउंड मूविंग-स्टफ ऑपरेशंस हो सकते हैं, जिसमें कई स्वैप शामिल होते हैं, लेकिन स्क्रैच स्पेस को मारने वाले प्रत्येक तत्व से बचने के लिए आप अनुकूलित कर सकते हैं। आपको बस यह सुनिश्चित करना होगा कि किसी भी डेटा को ओवरराइट करने से पहले, आपके पास इसकी एक प्रति कहीं सुरक्षित है और उस फ़ाइल का एक रिकॉर्ड जहां आपकी फ़ाइल को उस स्थिति में वापस लाने के लिए जाना चाहिए जहां इसमें प्रत्येक तत्व की बिल्कुल एक प्रति है।
जेरी का यह भी सही है कि सही जगह-जगह सॉर्टिंग सबसे व्यावहारिक उद्देश्यों के लिए बहुत कठिन और धीमी है। यदि आप स्क्रैच स्पेस के रूप में मूल फ़ाइल आकार के कुछ रैखिक अंश को छोड़ सकते हैं, तो आपके पास मर्ज सॉर्ट के साथ इसका बेहतर समय होगा।
आपकी स्पष्टीकरण के आधार पर, आपको इन-प्लेस प्रकार के साथ भी किसी भी फ्लश ऑपरेशन की आवश्यकता नहीं होगी। आप स्मृति में खरोंच अंतरिक्ष कि उसी तरह काम करता है, और अपने SIGINT हैंडलर बाहर निकलने के बजाय बाद एक असामान्य बाहर निकलने के स्टार्टअप पर बहाल करने से पहले आदेश सुरक्षित डेटा प्राप्त करने के लिए उपयोग कर सकते हैं कि जरूरत है, और आप उस स्मृति का उपयोग करने की आवश्यकता है सिग्नल-सुरक्षित तरीके से (जो तकनीकी रूप से sig_atomic_t
का उपयोग करके ध्वजांकित करने के लिए उपयोग करता है)। फिर भी, आप शायद एक वास्तविक जगह-जगह के मुकाबले एक विलय के साथ बेहतर हो।
मुझे लगता है कि आपको पूछना है कि कौन सा महत्वपूर्ण है? अंतरिक्ष, या प्रक्रिया को बाधित किया जाना चाहिए।यदि आपको यह सुनिश्चित करने की आवश्यकता है कि फ़ाइल दूषित नहीं है, तो आपको किसी भी तरह से इसकी प्रगति और पिछले राज्यों का ट्रैक रखना होगा - यह फ़ाइल की तुलना में अधिक जगह लेगा। –
सुरक्षित होने के लिए। प्रतिलिपि बनाएं और कॉपी को सॉर्ट करें। मैं नहीं कर सकता; फ़ाइल सिस्टम को 40 जीबी –
@ मार्टिन के साथ परेशानी होगी: आपकी कल्पना मेरे तरीके से काम नहीं करती है। मेरे प्राथमिक ड्राइव पर वर्तमान में 36.4 जीबी मुफ्त है। –