वास्तव में पायथन की फ़ाइल .flush () क्या कर रही है?


137

मैंने इसे फाइल ऑब्जेक्ट्स के लिए पायथन प्रलेखन में पाया :

फ्लश () जरूरी नहीं कि फाइल का डाटा डिस्क पर लिखे। इस व्यवहार को सुनिश्चित करने के लिए os.fsync () द्वारा फ्लश () का उपयोग करें।

तो मेरा सवाल है: वास्तव में पायथन क्या flushकर रहा है? मैंने सोचा था कि यह डिस्क पर डेटा लिखने के लिए मजबूर करता है, लेकिन अब मैं देखता हूं कि यह नहीं है। क्यों?

जवाबों:


219

इसमें आम तौर पर दो स्तर शामिल होते हैं:

  1. आंतरिक बफ़र्स
  2. ऑपरेटिंग सिस्टम बफ़र्स

आंतरिक बफ़र्स रनटाइम / लाइब्रेरी / भाषा द्वारा बनाई गई बफ़र्स हैं, जिनके खिलाफ आप प्रोग्रामिंग कर रहे हैं और हर लिखने के लिए सिस्टम कॉल से बचकर चीजों को गति देने के लिए है। इसके बजाय, जब आप किसी फ़ाइल ऑब्जेक्ट पर लिखते हैं, तो आप उसके बफर में लिखते हैं, और जब भी बफर भर जाता है, तो सिस्टम कॉल का उपयोग करके डेटा को वास्तविक फ़ाइल में लिखा जाता है।

हालाँकि, ऑपरेटिंग सिस्टम बफ़र्स के कारण, इसका मतलब यह नहीं हो सकता है कि डेटा डिस्क पर लिखा गया है । इसका अर्थ केवल यह हो सकता है कि डेटा को आपके रनटाइम द्वारा बनाए गए बफ़र्स से कॉपी किया जाता है, ऑपरेटिंग सिस्टम द्वारा बनाए गए बफ़र्स में।

यदि आप कुछ लिखते हैं, और यह बफर (केवल) में समाप्त होता है, और आपकी मशीन में बिजली कट जाती है, तो मशीन बंद होने पर डेटा डिस्क पर नहीं होता है।

तो, आप के साथ मदद करने के लिए उनके पास है flushऔर fsyncतरीकों, उनके संबंधित वस्तुओं पर।

पहला, flushबस किसी भी डेटा को लिख देगा जो कि प्रोग्राम बफर में वास्तविक फाइल में लैंगर करता है। आमतौर पर इसका मतलब है कि डेटा को प्रोग्राम बफर से ऑपरेटिंग सिस्टम बफर में कॉपी किया जाएगा।

विशेष रूप से इसका मतलब यह है कि यदि किसी अन्य प्रक्रिया में वही फ़ाइल पढ़ने के लिए खुली है, तो यह उस डेटा तक पहुंच बना सकेगा जिसे आपने फ़ाइल में फ़्लश किया था। हालांकि, यह जरूरी नहीं है कि यह डिस्क पर "स्थायी रूप से" संग्रहीत किया गया है।

ऐसा करने के लिए, आपको उस os.fsyncविधि को कॉल करने की आवश्यकता है जो यह सुनिश्चित करती है कि सभी ऑपरेटिंग सिस्टम बफ़र भंडारण उपकरणों के साथ सिंक्रनाइज़ हैं, दूसरे शब्दों में, यह विधि ऑपरेटिंग सिस्टम बफ़र्स से डेटा को डिस्क पर कॉपी करेगी।

आमतौर पर आपको किसी भी विधि से परेशान होने की आवश्यकता नहीं है, लेकिन यदि आप ऐसे परिदृश्य में हैं जहां व्यामोह डिस्क के बारे में वास्तव में समाप्त होता है तो यह एक अच्छी बात है, आपको निर्देश के अनुसार दोनों कॉल करना चाहिए।


2018 में परिशिष्ट।

ध्यान दें कि कैश मैकेनिज्म के साथ डिस्क अब 2013 की तुलना में बहुत अधिक सामान्य है, इसलिए अब कैशिंग और बफ़र्स के और भी अधिक स्तर हैं। मुझे लगता है कि इन बफ़र्स को सिंक / फ्लश कॉल द्वारा भी नियंत्रित किया जाएगा, लेकिन मुझे वास्तव में नहीं पता है।


10
जब मैं with file('blah') as fd: #dostuffनिर्माण का उपयोग करता हूं, तो मुझे पता है कि यह फ़ाइल विवरणक को बंद करने की गारंटी देता है। क्या यह फ्लश या सिंक भी करता है?
मार्सिन

3
@ मार्सीन: यह फ्लश करता है, लेकिन सिंक नहीं करता है।
एलेक्स I

8
fsyncपरमाणु के लिए आवश्यक है। आप किसी फ़ाइल को बंद करने, उसे फिर से खोलने और fsyncबीच में बिना अपनी सामग्री खोजने की उम्मीद नहीं कर सकते । यह अक्सर काम करता है, लेकिन यह ext4 और उदाहरण के लिए डिफ़ॉल्ट माउंट विकल्पों के साथ लिनक्स पर नहीं है। इसके अलावा fsyncवास्तव में थाली पर लोहा चुंबक-फ्लिप करने, क्योंकि 1 की गारंटी है नहीं: fsync (लैपटॉप मोड से) अक्षम हो सकता है, और 2: हार्ड डिस्क आंतरिक बफरिंग फ्लश करने के निर्देश दिए नहीं किया जा सकता है।
v.oddou

1
क्या किसी फाइल को किसी अन्य प्रक्रिया द्वारा लिखे जाने पर ऑपरेटिंग सिस्टम के बफर को फ्लश करने का कोई तरीका है?
नौका

1
fsync अपेक्षाकृत महंगा है। सामान्य तौर पर, आप मिशन महत्वपूर्ण सॉफ़्टवेयर नहीं लिख रहे हैं, जिसे डिस्क-एक्सेस के लिए 100% एसीआईडी ​​अनुपालन और स्थायित्व की आवश्यकता होती है, और यदि आप ऐसा करते हैं, तो शायद आप इसके बारे में दर्द से अवगत हैं और आपको इन गारंटियों को प्राप्त करने के लिए आवश्यक कदमों के बारे में पता होना चाहिए। । कॉलिंग fsync फिजिकल डिस्क एक्सेस के लिए डेटा को डिस्क पर लिखने के लिए प्रतीक्षा करेगा, जबकि फ्लशिंग और समापन केवल कैश मेमोरी में ले जाने के लिए डेटा की प्रतीक्षा करेगा। गति अंतर संभवतः परिमाण के कई आदेश हैं।
लास वी। कार्लसन

10

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


6
आप सही कह रहे हैं, लेकिन actuallyयहां सापेक्ष है: यदि लक्ष्य डिवाइस ने कैशिंग को सक्षम लिखा है, तो os.fsync()रिटर्न देते समय डेटा वास्तविक प्लैटर / चिप्स तक नहीं पहुंच सकता है।
Frédéric Hamidi

7

यह आंतरिक बफ़र को फ्लश करता है, जिससे माना जाता है कि OS फ़ाइल को बफ़र लिखने का कारण बनता है। [१] जब तक आप इसे अन्यथा नहीं करते तब तक पायथन ओएस के डिफ़ॉल्ट बफ़रिंग का उपयोग करता है।

लेकिन कभी-कभी ओएस अभी भी सहयोग नहीं करने का विकल्प चुनता है। विशेष रूप से विंडोज / NTFS में लिखने-देरी जैसी अद्भुत चीजों के साथ। मूल रूप से आंतरिक बफर को फ्लश किया जाता है, लेकिन ओएस बफर अभी भी इसे पकड़ रहा है। तो आपको os.fsync()उन मामलों में डिस्क के साथ लिखने के लिए ओएस को बताना होगा ।

[१] http://docs.python.org/library/stdtypes.html


0

मूल रूप से, फ्लश () आपके रैम बफर को साफ करता है, इसकी असली शक्ति यह है कि यह आपको बाद में इसे लिखना जारी रखने की अनुमति देता है - लेकिन इसे सबसे अच्छा / सबसे सुरक्षित लिखने के लिए फ़ाइल सुविधा के रूप में नहीं सोचा जाना चाहिए। यह आपके RAM को आने वाले अधिक डेटा के लिए फ्लश कर रहा है, बस। यदि आप यह सुनिश्चित करना चाहते हैं कि डेटा सुरक्षित रूप से फाइल करने के लिए लिखा गया है, तो इसके बजाय बंद () का उपयोग करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.