পাইথনের ফাইল.ফ্লুশ () ঠিক কী করছে?


137

আমি ফাইল পাইনের জন্য পাইথন ডকুমেন্টেশনে এটি পেয়েছি :

ফ্লাশ () অগত্যা ডিস্কে ফাইলটির ডেটা লেখেন না। এই আচরণটি নিশ্চিত করতে OS.fsync () এর পরে ফ্লাশ () ব্যবহার করুন।

সুতরাং আমার প্রশ্ন: পাইথন ঠিক কী flushকরছে? আমি ভেবেছিলাম যে এটি ডিস্কে ডেটা লিখতে বাধ্য করে, তবে এখন আমি দেখতে পাচ্ছি যে এটি তা নয়। কেন?

উত্তর:


219

সাধারণত দুটি স্তরের বাফারিং জড়িত রয়েছে:

  1. অভ্যন্তরীণ বাফার
  2. অপারেটিং সিস্টেম বাফারগুলি

অভ্যন্তরীণ বাফারগুলি রানফটাইম / লাইব্রেরি / ভাষার দ্বারা তৈরি বাফার যা আপনার বিরুদ্ধে প্রোগ্রামিং করছে এবং এটি প্রতিটি লেখার জন্য সিস্টেম কল এড়িয়ে জিনিসগুলিকে গতি বাড়ানো। পরিবর্তে, আপনি যখন কোনও ফাইল অবজেক্টে লিখেন, আপনি তার বাফারে লিখে ফেলেন এবং যখনই বাফারটি পূর্ণ হয়, তখন সিস্টেম কল ব্যবহার করে তথ্যটি প্রকৃত ফাইলটিতে লেখা হয়।

তবে, অপারেটিং সিস্টেম বাফারগুলির কারণে, এর অর্থ এই নয় যে ডেটাটি ডিস্কে লিখিত হয়েছে । এর অর্থ কেবল এই হতে পারে যে ডেটা আপনার রানটাইম দ্বারা পরিচালিত বাফারগুলি থেকে অপারেটিং সিস্টেম দ্বারা রক্ষণাবেক্ষণ করা বাফারগুলিতে অনুলিপি করা হয়।

যদি আপনি কিছু লিখেন এবং এটি বাফারে শেষ হয় (কেবল), এবং শক্তিটি আপনার মেশিনে কাটা হয়, মেশিনটি বন্ধ হয়ে গেলে সেই ডেটা ডিস্কে থাকে না।

সুতরাং, যাতে আপনার তাদের নিজস্ব অবজেক্টগুলিতে পদ্ধতি flushএবং fsyncপদ্ধতি রয়েছে তার সাথে সহায়তা করার জন্য ।

প্রথমটি, flushকোনও প্রোগ্রামের বাফারে থাকা যে কোনও ডেটা প্রকৃত ফাইলটিতে স্থির থাকে সেইগুলি সহজেই লিখবে। সাধারণত এর অর্থ হ'ল প্রোগ্রামটি বাফার থেকে অপারেটিং সিস্টেম বাফারে ডেটা অনুলিপি করা হবে।

বিশেষত এর অর্থ হ'ল অন্য প্রক্রিয়াতে যদি সেই একই ফাইলটি পড়ার জন্য খোলা থাকে, তবে আপনি যে ফাইলটি সবেমাত্র ফাইলটিতে প্রবেশ করেছেন সেগুলি অ্যাক্সেস করতে সক্ষম হবে। তবে, এটি অগত্যা এটির অর্থ এই নয় যে এটি ডিস্কে "স্থায়ীভাবে" সংরক্ষণ করা হয়েছে।

এটি করার জন্য, আপনাকে সেই os.fsyncপদ্ধতিটি কল করতে হবে যা নিশ্চিত করে যে সমস্ত অপারেটিং সিস্টেম বাফারগুলি স্টোরেজ ডিভাইসগুলির সাথে সেগুলি সিঙ্ক্রোনাইজ করা হয়েছে তারা অন্য কথায়, এই পদ্ধতিটি অপারেটিং সিস্টেম বাফারগুলি থেকে ডিস্কে ডেটা অনুলিপি করবে।

সাধারণত আপনার কোনও পদ্ধতির সাথে মাথা ঘামানোর দরকার নেই, তবে আপনি যদি এমন কোনও পরিস্থিতিতে থাকেন যেখানে ডিস্কে আসলে কী শেষ হয় সে সম্পর্কে প্যারানোইয়া ভাল জিনিস হয় তবে আপনাকে নির্দেশ অনুসারে উভয় কল করা উচিত।


2018 এ সংযোজন।

নোট করুন যে ক্যাশে প্রক্রিয়াধীন ডিস্কগুলি এখন ২০১৩ সালের তুলনায় এখন অনেক বেশি সাধারণ, তাই এখন আরও অনেক স্তর রয়েছে ক্যাশে এবং বাফারদের এতে জড়িত। আমি ধরে নিয়েছি যে এই বাফারগুলি সিঙ্ক / ফ্লাশ কলগুলিও পরিচালনা করা হবে তবে আমি সত্যি জানি না।


10
আমি যখন with file('blah') as fd: #dostuffকনস্ট্রাক্টটি ব্যবহার করি তখন আমি জানি এটি ফাইল বিবরণী বন্ধ করার গ্যারান্টি দেয়। এটিও ফ্লাশ করে বা সিঙ্ক করে?
মার্সিন

3
@ মার্সিন: এটি ফ্লাশ হয়েছে, তবে সিঙ্ক হয় না।
অ্যালেক্স I

8
fsyncপারমাণবিকতার জন্য প্রয়োজনীয়। আপনি কোনও ফাইল বন্ধ করতে, এটি পুনরায় খুলতে এবং fsyncমাঝখানে ছাড়া আপনার সামগ্রীগুলি খুঁজে পেতে আশা করতে পারবেন না । এটি প্রায়শই কাজ করে, তবে এটি ext4 এবং ডিফল্ট মাউন্ট বিকল্পগুলির সাথে লিনাক্সে নেই। এছাড়াও fsyncপ্ল্যাটারগুলিতে লোহাটিকে চুম্বক-উল্টানোর জন্য গ্যারান্টিযুক্ত নয়, কারণ 1: fsync অক্ষম করা যেতে পারে (ল্যাপটপ-মোড দ্বারা), এবং 2: হার্ড ডিস্কের অভ্যন্তরীণ বাফারিং ফ্লাশ করার জন্য নির্দেশিত নাও হতে পারে।
v.oddou

1
সমস্ত ফাইলের জন্য অপারেটিং সিস্টেমের বাফারটি ফ্লাশ করার কোনও উপায় আছে, যদি ফাইলটি অন্য কোনও প্রক্রিয়া দ্বারা লিখিত হয়?
নচট

1
fsync তুলনামূলকভাবে ব্যয়বহুল। সাধারণভাবে, আপনি মিশন সমালোচনা সফ্টওয়্যারটি লিখছেন না যা ডিস্ক অ্যাক্সেসের জন্য 100% এসিডি সম্মতি এবং স্থায়িত্বের প্রয়োজন, এবং যদি আপনি এটি করেন তবে সম্ভবত আপনি ব্যথার সাথে এটি সম্পর্কে সচেতন হন এবং এই গ্যারান্টিগুলি পেতে আপনি কী পদক্ষেপ নিতে পারেন সে সম্পর্কে সচেতন হওয়া উচিত । কলিং ফাইএনসিচ ডিস্কে ডেটা লিখতে ফিজিকাল ডিস্ক অ্যাক্সেসের জন্য অপেক্ষা করবে, অন্যদিকে ফ্লাশিং এবং ক্লোজিং কেবল ডেটা ক্যাশে স্মৃতিতে স্থানান্তরিত হওয়ার জন্য অপেক্ষা করবে। গতির পার্থক্যটি সম্ভবত মাত্রার কয়েকটি আদেশ।
লাসে ভি কার্লসেন

10

কারণ অপারেটিং সিস্টেমটি এটি নাও করতে পারে। ফ্লাশ অপারেশনটি ফাইলের ডেটাটিকে র‍্যামের ফাইল ক্যাশে ফোর করে, এবং সেখান থেকে ওএসের কাজটি আসলে এটি ডিস্কে প্রেরণ করা।


6
আপনি ঠিক বলেছেন, তবে actuallyএখানে আপেক্ষিক: টার্গেট ডিভাইসে লিখিত ক্যাচিং সক্ষম করা থাকলে, os.fsync()রিটার্নের সময় ডেটা প্রকৃত প্ল্যাটার / চিপগুলিতে না পৌঁছতে পারে ।
ফ্রেডরিক হামিদি

7

এটি অভ্যন্তরীণ বাফারটিকে ফ্লাশ করে, যার ফলে ওএসকে ফাইলটিতে বাফারটি লিখতে হবে [[1] পাইথন ওএসের ডিফল্ট বাফারিং ব্যবহার করে যদি না আপনি এটি অন্যথায় না করেন।

তবে কখনও কখনও ওএস এখনও সহযোগিতা না করার সিদ্ধান্ত নেয়। বিশেষত উইন্ডোজ / এনটিএফএসে রচনা-বিলম্বের মতো দুর্দান্ত জিনিসগুলির সাথে। মূলত অভ্যন্তরীণ বাফারটি ফ্লাশ করা হয়েছে, তবে ওএস বাফার এখনও এটি ধরে রেখেছে। সুতরাং আপনাকে ওএসকে os.fsync()সেই পরিস্থিতিতে ডিস্কে এটি লিখতে বলতে হবে ।

[1] http://docs.python.org/library/stdtyype.html


0

মূলত, ফ্লাশ () আপনার র‌্যাম বাফারকে পরিষ্কার করে দেয়, এর আসল শক্তি হ'ল এটি আপনাকে পরে এটি লিখতে দেয় - তবে এটি ফাইলের বৈশিষ্ট্যটিতে সবচেয়ে ভাল / নিরাপদ রচনা হিসাবে ভাবা উচিত নয়। আরও ডেটা আসার জন্য এটি আপনার র‌্যাম ফ্লাশ করছে, এটাই। আপনি যদি নিশ্চিত করতে চান যে ডেটা ফাইলটিতে নিরাপদে লিখিত হয়েছে তবে তার পরিবর্তে ক্লোজ () ব্যবহার করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.