পাইথন কতবার একটি ফাইলে ফ্লাশ করে?


228
  1. পাইথন কতবার একটি ফাইলে ফ্লাশ করে?
  2. পাইথন কতবার স্টডআউটে ফ্লাশ করে?

আমি (1) সম্পর্কে অনিশ্চিত

(2) হিসাবে, আমি বিশ্বাস করি পাইথন প্রতিটি নতুন লাইনের পরে স্ট্যাডআউটে চলে আসে। তবে, যদি আপনি কোনও ফাইল হতে স্টডআউটকে ওভারলোড করেন তবে এটি কি প্রায়শই ঘন ঘন ফ্লাশ হয়?

উত্তর:


332

ফাইল অপারেশনের জন্য পাইথন অপারেটিং সিস্টেমের ডিফল্ট বাফারিং ব্যবহার করে আপনি অন্যথায় এটি কনফিগার না করে unless আপনি বাফার সাইজ, আনফফার্ড বা লাইন বাফার নির্দিষ্ট করতে পারেন।

উদাহরণস্বরূপ, খোলা ফাংশনটি একটি বাফার আকারের যুক্তি নেয়।

http://docs.python.org/library/functions.html#open

"Buffচ্ছিক বাফারিং যুক্তি ফাইলটির পছন্দসই বাফার আকারটি নির্দিষ্ট করে:"

  • 0 এর অর্থ নিখরচায়,
  • 1 মানে লাইন বাফার করা,
  • অন্য যে কোনও ধনাত্মক মান মানে এর আকার (প্রায়) বাফার ব্যবহার করুন।
  • নেতিবাচক বাফারিংয়ের অর্থ সিস্টেম ডিফল্ট ব্যবহার করা হয় যা সাধারণত টিটি ডিভাইসগুলির জন্য লাইন বাফার হয় এবং অন্য ফাইলগুলির জন্য সম্পূর্ণ বাফার হয়।
  • বাদ দেওয়া থাকলে সিস্টেম ডিফল্ট ব্যবহার করা হয়।

কোড:

bufsize = 0
f = open('file.txt', 'w', buffering=bufsize)

23
"লাইন বাফার" অংশের জন্য +1। ঠিক আমি যা খুঁজছিলাম এবং এটি একটি কবজির মতো কাজ করে।
মূক্ত

2
পাইথন ৩.৪.৩ ব্যবহার করা যখন আমি open('file.txt', 'w', 1)সঠিক লাইন বাফারিং করি। তবে আমি যদি আরও বড় কিছু করি (আমি চেয়েছিলাম open('file.txt', 'w', 512)) এটি io.DEFAULT_BUFFER_SIZE8192 এর পূর্ণ বাফার করে। এটি কি পাইথন বাগ, লিনাক্স বাগ, বা আইডি 10 টি বাগ bu
ব্রুনো ব্রোনোস্কি

ইতিমধ্যে খোলা স্ট্রিমগুলির জন্য বাফারিং কি পরিবর্তন করা সম্ভব ? বলুন, আমি stdoutকনসোল বা কোনও ফাইলে পুনঃনির্দেশিত না হয়েই লাইন-বাফার হতে চাই ?
মিখাইল টি।

1
@ চর্লিপারপার্কার আপনি যখন write()কোনও ফাইল হ্যান্ডলে কল করবেন তখন আউটপুট মেমরির সাহায্যে বাফার হয়ে যায় এবং বাফার পূর্ণ না হওয়া পর্যন্ত জমা হয়ে যায় ... এমন সময় বাফারটি "ফ্লাশ" হয়ে যায় (বাফার থেকে ফাইলটিতে সামগ্রী লিখিত থাকে)। আপনি flush()কোনও ফাইল হ্যান্ডলে পদ্ধতিতে কল করে স্পষ্টভাবে বাফারটি ফ্লাশ করতে পারেন ।
কোরি গোল্ডবার্গ

3
নোট করুন যে আনফফার্ড (0) কেবল বাইনারি মোডে উপলব্ধ এবং লাইন বাফার (1) কেবলমাত্র পাঠ্য মোডে উপলব্ধ।
জায়েদএইচ

172

আপনি flush()পদ্ধতিটি সহ প্রোগ্রামটিতে কোনও ফাইলটিতে বাফারটিকে ফ্লাশ করতে বাধ্য করতে পারেন ।

with open('out.log', 'w+') as f:
    f.write('output is ')
    # some work
    s = 'OK.'
    f.write(s)
    f.write('\n')
    f.flush()
    # some other work
    f.write('done\n')
    f.flush()

একটি আউটপুট ফাইলটি টেলিংয়ের সাথে আমি এই দরকারীটি পেয়েছি tail -f


54
দস্তাবেজগুলি থেকে:Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
ববিস্মিজ্ননাম

1
@ ববিসমিজন্নাম পরের বারের লিঙ্কটি ডক্সের সাথে যুক্ত করুন। আমি যে তথ্যসূত্রটি পাই তা কেবলমাত্র github.com/jprzywoski/python-references/blob/master/source/docs/… থেকে এবং আমি জানি না কে সে who
ব্রুনো ব্রোনোস্কি

5
@ ব্রুনো ব্রোনোস্কি ভালো পয়েন্ট দস্তাবেজ: Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
ববিস্মিজনম

আমি কি বিভ্রান্ত তা শব্দটির flushingঅর্থ কী। কেন এটা আমাদের দরকার? এটি কিসের জন্যে? আমার কেন এটি যত্ন করা উচিত?
চার্লি পার্কার

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

13

এটি অজগরটির ক্ষেত্রেও প্রযোজ্য কিনা তা আমি জানি না তবে আমি মনে করি এটি আপনি যে অপারেটিং সিস্টেমটি চালাচ্ছেন তার উপর নির্ভর করে।

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

আপনার যদি প্রয়োজন হয় তবে আপনি আউটপুটটিকে স্বয়ংক্রিয়ভাবে ফ্লাশ করতে সক্ষম হতে পারেন।

সম্পাদনা: আমার মনে হয় আপনি অজগরকে এভাবে অটো-ফ্লাশ করবেন ( এখান থেকে ভিত্তিক )

#0 means there is no buffer, so all output
#will be auto-flushed
fsock = open('out.log', 'w', 0)
sys.stdout = fsock
#do whatever
fsock.close()

12

আপনি ডিও ডিফল্ট বাফার আকারটি io মডিউল থেকে কেবলমাত্র ডিএফএএল.এফ.বি.উফ.ফার_সিজিবি বৈশিষ্ট্যটিতে কল করে দেখতে পারেন।

import io
print (io.DEFAULT_BUFFER_SIZE)

1
ধন্যবাদ! এটি জেনে রাখা ভাল যে পাইথন ওএসকে সংজ্ঞায়িত হিসাবে সেট করে ... তবে এটি ওএস প্রাক-সংজ্ঞা দেয় তা খুঁজে পেতে সহায়তা করে।
কমেটসং

2

তিনি কোনটিকে পছন্দ করেন তা চয়ন করার জন্য এখানে অপির একটি উপায় রয়েছে।

__init__অন্য কোনও কোডের আগে .py ফাইলে নীচের কোডটি অন্তর্ভুক্ত করার সময় , মুদ্রিত বার্তাগুলি printএবং কোনও ত্রুটি আরবেটনের লগ.টেক্সটে লগ করা হবে না তবে আপনার ডিস্কে ফাইলগুলি পৃথক করার জন্য:

import sys

path = "/Users/#username#"

errorLog = open(path + "/stderr.txt", "w", 1)
errorLog.write("---Starting Error Log---\n")
sys.stderr = errorLog
stdoutLog = open(path + "/stdout.txt", "w", 1)
stdoutLog.write("---Starting Standard Out Log---\n")
sys.stdout = stdoutLog

(ম্যাকের জন্য, পরিবর্তন করুন #username# আপনার ব্যবহারকারীর ফোল্ডারের নাম Windows উইন্ডোজ আপনার ব্যবহারকারী ফোল্ডারের পাথের আলাদা বিন্যাস থাকবে)

আপনি যখন কোনও পাঠ্য সম্পাদককে ফাইলগুলি খুলেন যা ডিস্কে থাকা ফাইলটি পরিবর্তন করা হয় তখন এটির বিষয়বস্তু সতেজ করে তোলে (ম্যাকের জন্য উদাহরণ: টেক্সটএইডিট টেক্সটরঙ্গলার করে না তবে) আপনি দেখতে পাবেন যে লগগুলি রিয়েল-টাইমে আপডেট হচ্ছে।

ক্রেডিট: এই কোডটি বেশিরভাগ লাইভএপিআই নিয়ন্ত্রণ পৃষ্ঠের লিপি থেকে নাথন রামেলা দ্বারা অনুলিপি করা হয়েছিল

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