2009-03-03 12 views
5

मेरे पास एक फ़ाइल लिखने के लिए खुली है, और एक प्रक्रिया दिन के लिए चल रही है - फाइल में अपेक्षाकृत यादृच्छिक क्षणों में कुछ लिखा गया है। मेरी समझ है - जब तक मैं file.close() नहीं करता - वहाँ एक मौका है वास्तव में डिस्क में कुछ भी बचाया नहीं है। क्या यह सच है?क्या फाइल में लिखने के लिए पायथन में COMMIT एनालॉग है?

क्या होगा यदि मुख्य प्रक्रिया अभी तक समाप्त नहीं होने पर सिस्टम क्रैश हो जाए? क्या हर बार एक बार प्रतिबद्ध करने का कोई तरीका है ... कहें - 10 मिनट (और मैं इसे स्वयं प्रतिबद्ध करता हूं - टाइमर चलाने की कोई ज़रूरत नहीं है)? File.close() और खुली है (फ़ाइल, 'ए') एकमात्र तरीका है, या बेहतर विकल्प हैं?

उत्तर

17

ऐसा करने के लिए आपको file.flush() का उपयोग करने में सक्षम होना चाहिए।

3

यदि आप f.flush() जोड़ने के लिए वर्तमान प्रक्रिया को मारना नहीं चाहते हैं (ऐसा लगता है कि यह पहले से ही दिनों के लिए चल रहा है?), तो आपको ठीक होना चाहिए। आप फ़ाइल आप बड़ा हो रही करने के लिए लिख रहे हैं देखते हैं, तो आपको लगता है कि डेटा ...

खो देंगे अजगर डॉक्स से:

लिखने (एसटीआर) फ़ाइल के लिए एक स्ट्रिंग लिखें। कोई वापसी मूल्य नहीं है। बफरिंग के कारण, स्ट्रिंग वास्तव में फ़ाइल में तब तक दिखाई नहीं दे सकती है जब तक फ्लश() या बंद() विधि को कॉल नहीं किया जाता है।

ऐसा लगता है जैसे पायथन की बफरिंग सिस्टम स्वचालित रूप से फ़ाइल ऑब्जेक्ट्स फ्लश करेगा, लेकिन ऐसा होने पर इसकी गारंटी नहीं है।

2

यह सुनिश्चित करने के लिए कि डेटा डिस्क पर लिखा गया है, file.flush() का उपयोग करें os.fsync(file.fileno()) के बाद।

2

जैसा कि पहले ही कहा जा चुका है कि बफर से लिखने के लिए .flush() विधि का उपयोग किया गया है, लेकिन फ्लश करने के लिए बहुत सी कॉल का उपयोग करने से बचें क्योंकि यह वास्तव में आपके लेखन को धीमा कर सकता है (यदि एप्लिकेशन तेजी से लिखता है) क्योंकि आप अपने फाइल सिस्टम को उन परिवर्तनों को लिखने के लिए मजबूर करेंगे जो इसके बफर आकार से छोटे हैं जो आपको अपने घुटनों तक ला सकते हैं। :)