रूबी में आईओ बफरिंग कैसे काम करता है? IO
और File
कक्षाओं का उपयोग करते समय डेटा को अंतर्निहित धारा में कितनी बार फ़्लश किया जाता है? यह ओएस बफरिंग से तुलना कैसे करता है? यह सुनिश्चित करने के लिए क्या किया जाना चाहिए कि प्रोसेसिंग के लिए इसे वापस पढ़ने से पहले, डेटा को डिस्क पर लिखा गया है?रूबी और ओएस I/O बफरिंग को समझना
26
A
उत्तर
48
रूबी आईओ प्रलेखन कि यह कैसे काम करता है बफरिंग पर 100% स्पष्ट नहीं है, लेकिन यह आप क्या प्रलेखन से निकाल सकते हैं है:
- रूबी आईओ अपने स्वयं के आंतरिक बफर
- है के अलावा अंतर्निहित ऑपरेटिंग सिस्टम आगे बफर डेटा हो सकता है या नहीं।
प्रासंगिक तरीकों देखने के लिए पर:
IO.flush
: FlushesIO
। मैंने रूबी स्रोत को भी देखा औरIO.flush
पर कॉल को अंतर्निहित ओएसfflush()
भी कहा जाता है। फ़ाइल को कैश करने के लिए यह पर्याप्त होना चाहिए, लेकिन डिस्क पर भौतिक डेटा की गारंटी नहीं देता है।IO.sync=
: यदिtrue
पर सेट किया गया है, तो रूबी आंतरिक बफरिंग नहीं की जाती है। सब कुछ ओएस को immidiately भेजा जाता है, औरfflush()
प्रत्येक लेखन के लिए बुलाया जाता है।IO.sync
: वर्तमान सिंक सेटिंग (true
याfalse
) देता है।IO.fsync
: ओएस पर रुबी बफर + कॉलfsync()
दोनों को फ़्लश करता है (यदि यह इसका समर्थन करता है)। यह भौतिक डिस्क फ़ाइल के लिए सभी तरह से एक पूर्ण फ्लश की गारंटी देगा।IO.close
: रुबीIO
बंद करता है और ओएस को लंबित डेटा लिखता है। ध्यान दें कि यहfsync()
का संकेत नहीं देता है। POSIX दस्तावेज़close()
पर कहता है कि यह गारंटी नहीं देता है कि फ़ाइल को भौतिक रूप से फ़ाइल में लिखा गया है। तो आपको इसके लिए एक स्पष्टfsync()
कॉल का उपयोग करने की आवश्यकता है।
निष्कर्ष: flush
और/या close
फ़ाइल कैश्ड करने के लिए पर्याप्त होना चाहिए ताकि यह पूरी तरह से किसी अन्य प्रक्रिया या ऑपरेशन द्वारा पढ़ा जा सकता। निश्चित रूप से भौतिक मीडिया के लिए फ़ाइल को सभी तरह से प्राप्त करने के लिए, आपको IO.fsync
पर कॉल करने की आवश्यकता है।
अन्य संबंधित तरीके:
IO.syswrite
: बाईपास रूबी आंतरिक बफ़र्स और एक सीधी ओएसwrite
है। यदि आप इसका उपयोग करते हैं तो इसेIO.read/write
के साथ मिश्रित न करें।IO.sysread
: ऊपर जैसा ही है, लेकिन पढ़ने के लिए।
1
रूबी ओएस के शीर्ष पर अपनी आंतरिक बफरिंग करता है। जब आप file.flush रूबी अपने आंतरिक बफर flushes। फ़ाइल को डिस्क पर लिखा गया है यह सुनिश्चित करने के लिए आपको file.fsync करने की आवश्यकता है। लेकिन अंत में आप यह सुनिश्चित नहीं कर सकते कि फाइल डिस्क पर लिखी गई है, यह ओएस, एचडीडी नियंत्रक और एचडीडी पर निर्भर करती है।