কোনও ফাইলের লেখার মতো নামী পাইপ ধীর কেন?


18

আমি নামী পাইপগুলি কীভাবে কাজ করে তা বোঝার চেষ্টা করছি যাতে আমি আমার ওয়ান-ওয়ে আন্তঃসম্পর্ক যোগাযোগকে আরও সহজ করে তুলতে পারি। আমি একটি বৃত্তাকার বাফারে ডেটা অনুলিপি করার কারণে কিছু ওভারহেড আশা করি, যা আমি ভেবেছিলাম যে এটি র‍্যামে সঞ্চিত আছে, এবং তাই আমি পাইপটি কোনও ফাইলটিতে লেখার চেয়ে অনেক দ্রুত হবে বলে আশা করি (কারণ র‌্যাম ডিস্কের চেয়ে প্রস্থের দ্রুততর আদেশ) orders

পরিবর্তে, আমি দেখতে পেয়েছি যে নামক পাইপ (বা বেনামে পাইপ) একটি ফাইলের মতোই গতি। এটি 3 গিগাহার্টজ ডেস্কটপে একটি সাধারণ ডিস্ক ড্রাইভ (শক্ত রাষ্ট্র নয়), উবুন্টু লিনাক্স চালিত। পাইথনে এখানে সরলিকৃত পরীক্ষা প্রোগ্রাম রয়েছে:

import sys
import time
import random

megabyte = "".join(random.choice("abcdefghijklmnopqrstuvwxyz") for x in range(1024**2))

while True:
    before = time.time()
    sys.stdout.write(megabyte)
    after = time.time()
    sys.stderr.write("{} microseconds\n".format(1e6 * (after - before)))

সরাসরি পাইপ করা /dev/null:

python test.py > /dev/null

প্রতি মেগাবাইটের জন্য 2.1 মাইক্রোসেকেন্ড (ধ্রুবক) উত্পাদন হয়।

একটি ফাইল পাইপিং:

python test.py > /tmp/testout.txt

500 মাইক্রোসেকেন্ড এবং 930 মাইক্রোসেকেন্ডের মধ্যে ঝাঁপ দেয় (ফাইলটি বড় হওয়ার সাথে সাথে বৃহত্তর মানটি আরও সাধারণ হয়ে যায় --- সম্ভবতঃ এটি ডিস্কের জায়গার সন্ধান করছে)।

তারপরে নাম করা পাইপ:

mkfifo testpipe
cat testpipe > /dev/null &
python test.py > testpipe

640 মাইক্রোসেকেন্ড (ধ্রুবক) এবং একটি নামবিহীন পাইপ দেয়:

python test.py | cat > /dev/null

এছাড়াও 650 মাইক্রোসেকেন্ড (ধ্রুবক) উত্পাদন হয়।

পাইপের গতি ফাইলের গতির চেয়ে কেন বেশি তার কারণ ব্যাখ্যা করতে পারবেন /dev/null? আমার কোথাও একটি স্যুইচ থাকতে পারে যাতে বলা হয়েছে, "র্যাম-ভিত্তিক বাফারের পরিবর্তে ফাইল-ভিত্তিক বাফারের মাধ্যমে পাইপ চালান," এবং আমি কি সেই সুইচটি পরিবর্তন করতে পারি? এটি কার্নেল বিকল্প বা শেল পরিবর্তনশীল হতে পারে?

অন্য ব্যাখ্যা: ধরুন যে ডিস্ক আউটপুট 500 এবং 930 মাইক্রোসেকেন্ডের মধ্যে লাফ দেয় কারণ 500 কেবল পাইপিং করছে এবং 930 আসলে লেখা হচ্ছে। তারপরে উভয় ক্ষেত্রে পাইপিংয়ের জন্য 500 ~ 640 সমতুল্য। তবে, সেই ব্যাখ্যার অধীনে পাইপিং এবং ডিস্কে আসলে লেখার মধ্যে কেন কেবল দুটি ফ্যাক্টর রয়েছে? র‌্যাম ডিস্ক সম্পর্কে কথা বলার ওয়েবসাইটগুলি বলে যে র‌্যাম ডিস্কগুলি হার্ড ডিস্কের চেয়ে 50-200 গুণ বেশি দ্রুত।


1
লেখা /dev/nullআসলে বেশ সস্তা হয়, অন্য যে কোনো স্থানে লেখার সময় - অনেক বেশি ব্যয়বহুল যেমন প্রচেষ্টা হ্যান্ডলিং এর "অনেক" দরকার - এটা একটি ফাইল, একটি হিসাবে FIFO, একটি নল বা যাই হোক না কেন হও।
glglgl

উত্তর:


31

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

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


আমরা কখন আমাদের ব্লক ডিভাইসগুলির সন্ধানের সময়টির বিষয়ে চিন্তা করা বন্ধ করব? :)
EEAA

5
@EEAA সমস্ত এসএসডি, সর্বদা।

1
আপনি ঠিক বলেছেন: sync()ডিস্ক লেখার সময় দিয়ে গড়ে 74,000 মাইক্রোসেকেন্ড হয়ে যায়। ( flush()আমি আমার পরীক্ষার এক প্রকরণে যা করছিলাম তা তা করেনি)) তাহলে আমার ব্যাখ্যাটি হ'ল প্রতি মেগাবাইটে 500 ~ 640 মাইক্রোসেকেন্ডগুলি আসলে পাইপের ওভারহেডটি বোঝায়, ধন্যবাদ।
জিম পিভারস্কি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.