2011-07-14 14 views
26

रूबी में आईओ बफरिंग कैसे काम करता है? IO और File कक्षाओं का उपयोग करते समय डेटा को अंतर्निहित धारा में कितनी बार फ़्लश किया जाता है? यह ओएस बफरिंग से तुलना कैसे करता है? यह सुनिश्चित करने के लिए क्या किया जाना चाहिए कि प्रोसेसिंग के लिए इसे वापस पढ़ने से पहले, डेटा को डिस्क पर लिखा गया है?रूबी और ओएस I/O बफरिंग को समझना

उत्तर

48

रूबी आईओ प्रलेखन कि यह कैसे काम करता है बफरिंग पर 100% स्पष्ट नहीं है, लेकिन यह आप क्या प्रलेखन से निकाल सकते हैं है:

  • रूबी आईओ अपने स्वयं के आंतरिक बफर
  • है के अलावा अंतर्निहित ऑपरेटिंग सिस्टम आगे बफर डेटा हो सकता है या नहीं।

प्रासंगिक तरीकों देखने के लिए पर:

  • IO.flush: Flushes IO। मैंने रूबी स्रोत को भी देखा और 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 करने की आवश्यकता है। लेकिन अंत में आप यह सुनिश्चित नहीं कर सकते कि फाइल डिस्क पर लिखी गई है, यह ओएस, एचडीडी नियंत्रक और एचडीडी पर निर्भर करती है।