আউটপুট ফাইলটি যখন / ডেভেল / নাল হয় তখন তার ফাইল ফাইল সামগ্রীগুলি এড়িয়ে যায় কেন?


21

এটিতে 400 গিগাবাইটের বেশি ডেটা সহ আমার একটি ডিরেক্টরি রয়েছে। আমি যাচাই করতে চেয়েছিলাম যে সমস্ত ফাইল ত্রুটি ছাড়াই পঠন করা যায়, তাই আমি ভেবেছিলাম এমন একটি সহজ উপায় tarএটি /dev/null। তবে পরিবর্তে আমি নিম্নলিখিত আচরণটি দেখতে পাচ্ছি:

$ time tar cf /dev/null .

real    0m4.387s
user    0m3.462s
sys     0m0.185s
$ time tar cf - . > /dev/null

real    0m3.130s
user    0m3.091s
sys     0m0.035s
$ time tar cf - . | cat > /dev/null
^C

real    10m32.985s
user    0m1.942s
sys     0m33.764s

উপরের তৃতীয় কমান্ডটি বেশ আগে থেকেই বেশিক্ষণ দৌড়ানোর পরে Ctrl+ জোর করে বন্ধ করে দেওয়া হয়েছিল C। তদতিরিক্ত, প্রথম দুটি কমান্ড কাজ করার সময়, স্টোরেজ ডিভাইসের ক্রিয়াকলাপ সূচকটি .প্রায় সর্বদা অলস ছিল। তৃতীয় কমান্ডের সাহায্যে সূচকটি নিয়মিত আলোকিত হয়, যার অর্থ চরম ব্যস্ততা।

সুতরাং এটি মনে হয়, যখন tarএটির আউটপুট ফাইলটি এটি সন্ধান করতে সক্ষম হয় /dev/null, অর্থাত্ যখন /dev/nullসরাসরি ফাইল হ্যান্ডেলটি খোলা থাকে যা এতে tarলেখা হয়, তখন ফাইল বডিটি এড়িয়ে যায়। ( ডিরেক্টরিতে সমস্ত ফাইল 'লাল' হয়ে যায় মুদ্রণের vজন্য বিকল্প যুক্ত করা )tartar

তো আমি ভাবছি কেন এমন হয়? এটা কি একরকম অপটিমাইজেশন? যদি হ্যাঁ, তবে কেন এমন tarবিশেষ মামলার জন্য এমন সন্দেহজনক অপ্টিমাইজেশন কেন করতে চান?

আমি লিনাক্স 4.14.105 এএমডি 64 তে GNU টার 1.26 গ্লিবসি 2.27 ব্যবহার করছি with


7
ব্যবহারিক বিকল্প হিসাবে, এর মতো কিছু বিবেচনা করুন find . -type f -exec shasum -a256 -b '{}' +। নেই শুধু এটা না আসলে পড়া এবং সমস্ত ডেটা চেকসাম, কিন্তু আপনি যদি আউটপুট সংরক্ষণ আপনি পরে এটা চেক করার জন্য যে ফাইলের বিষয়বস্তু পরিবর্তন হয়নি পুনরায় রান করতে পারেন।
ইলমারি করোনেন

কিছু পরিমাপ করার আপনার কাছে ব্যবহার করতে পারেন pv: tar -cf - | pv >/dev/null। এটি ইস্যুটিকে pv
পাশ কাটিয়ে

আপনি জিএনইউ টারের একটি সুপরিচিত মিস বৈশিষ্ট্যটি হিট করেছেন। আপনার gtar -cf /dev/zero ...যা পছন্দ তা পেতে ব্যবহার করুন ।
সহজেই

উত্তর:


25

এটা তোলে হয় একটি নথিভুক্ত অপ্টিমাইজেশান :

সংরক্ষণাগারটি যখন তৈরি করা হচ্ছে /dev/null, তখন জিএনইউ টার ইনপুট এবং আউটপুট ক্রিয়াকে ছোট করার চেষ্টা করে। আমন্ডা ব্যাকআপ সিস্টেমটি, যখন জিএনইউ টারের সাথে ব্যবহৃত হয়, তখন একটি প্রাথমিক সাইজিং পাস থাকে যা এই বৈশিষ্ট্যটি ব্যবহার করে।


4
আহা, আমি ইনস্টল করা ম্যান পৃষ্ঠাতে এটি বর্ণনা করা হয়নি। info tarপরিবর্তে চেষ্টা করা উচিত ছিল ...
রুস্লান

9
তাদের সত্যই লোক এবং তথ্য পৃষ্ঠাগুলি সিঙ্কে রাখা উচিত, এটি কার্যত একটি বাগ যা তারা নয়
Xen2050

9
@ রুস্লান বেশিরভাগ জিএনইউ ইউটিলিটি সহ, ম্যান পেজে কেবল একটি সংক্ষিপ্তসার থাকে, যখন আপনি মনে রাখবেন যে এটির কিছু করার বিকল্প রয়েছে তবে বিকল্পটির নাম মনে নেই। সম্পূর্ণ ডকুমেন্টেশন এমন বিন্যাসে রয়েছে যা ম্যান পেজগুলিতে ভাল অনুবাদ করে না এবং এটি infoব্রাউজারে বা এইচটিএমএল হিসাবে উপলব্ধ ।
গিলস 'এ-ও অশুভ হওয়া বন্ধ করুন'


8

এটি বিভিন্ন প্রোগ্রামের সাথে ঘটতে পারে, উদাহরণস্বরূপ, একবার ব্যবহার করার সময় আমার এই আচরণটি হয়েছিল cp file /dev/null; আমার ডিস্ক পড়ার গতি সম্পর্কে অনুমান করার পরিবর্তে কমান্ডটি কয়েক মিলি সেকেন্ডের পরে ফিরে আসে।

যতদূর আমার মনে আছে, এটি সোলারিস বা এআইএক্স-এ ছিল তবে নীতিটি সব ধরণের ইউনিক্স-ওয়াই সিস্টেমের ক্ষেত্রে প্রযোজ্য।

পুরানো সময়ে, যখন কোনও প্রোগ্রাম কোনও ফাইল কোনও জায়গায় অনুলিপি করত, তখন readকলগুলির মধ্যে বিকল্প ছিল যেগুলি ডিস্ক থেকে কিছু তথ্য (বা যা কিছু ফাইল বর্ণনাকারী উল্লেখ করছে) মেমোরিতে আসে ( readফেরত আসার সাথে গ্যারান্টি সহ সবকিছুই থাকে ) এবং writeকলগুলি (যা স্মৃতিশক্তি গ্রহণ করে এবং সামগ্রীকে গন্তব্যে প্রেরণ করে)।

তবে এটি অর্জনের জন্য কমপক্ষে দুটি নতুন উপায় রয়েছে:

  • লিনাক্সের সিস্টেম কল রয়েছে copy_file_range(অন্যান্য ইউনিক্সে মোটেও পোর্টেবল নয়) এবং sendfile(কিছুটা পোর্টেবল; মূলত নেটওয়ার্কে একটি ফাইল প্রেরণের উদ্দেশ্যে, তবে এখন কোনও গন্তব্য ব্যবহার করতে পারে)। তারা স্থানান্তর অনুকূলিতকরণ উদ্দেশ্যে; প্রোগ্রাম যদি সেগুলির মধ্যে একটি ব্যবহার করে তবে সহজেই এটি উপলব্ধি করতে পারে যে কার্নেলটি লক্ষ্যটি সনাক্ত করে /dev/nullএবং সিস্টেম কলটিকে কোনও অপ-অপারেটে রূপান্তরিত করে

  • প্রোগ্রামগুলি mmapফাইলের বিষয়বস্তুগুলি পরিবর্তে পেতে ব্যবহার করতে পারে read, এর মূল অর্থ "সিস্টেমের কল রিটার্ন করার সময় ডেটা উপস্থিত রয়েছে তা নিশ্চিত করে" পরিবর্তে "যখন মেমরির সেই খণ্ডটি অ্যাক্সেস করার চেষ্টা করি তখন ডেটা সেখানে থাকে তা নিশ্চিত করুন" means সুতরাং একটি প্রোগ্রাম mmapউত্স ফাইল করতে পারে , তারপরে writeম্যাপ করা মেমরির অংশটিকে কল করতে পারে । যাইহোক, লেখার /dev/nullজন্য লিখিত ডেটা অ্যাক্সেস করার প্রয়োজন নেই, "এটি অবশ্যই আছে তা নিশ্চিত করুন" শর্তটি কখনই ট্রিগার হয় না, ফলস্বরূপ ফাইলটি আর পড়ে না।

নিশ্চিত নয় যে জিনু টার কোনটি ব্যবহার করে এবং কোনটি এই দুটি মেকানিজম ব্যবহার করে যখন এটি লিখিত হয়েছে তা সনাক্ত করে /dev/null, তবে সে কারণেই কোনও প্রোগ্রাম, যখন পড়ার গতি পরীক্ষা করতে ব্যবহৃত হয় , তার | cat > /dev/nullপরিবর্তে চালানো উচিত > /dev/null- এবং কেন করা | cat > /dev/nullউচিত করা এড়ানো অন্যান্য সব ক্ষেত্রে।


আমি মনে করি জিএনইউ tarতথ্য পৃষ্ঠাতে (অন্য উত্তর দেখুন) এর অন্তর্নিহিততাটি হ'ল এটির জন্য এটির একটি বিশেষ মোড রয়েছে যা সম্ভবত ফাইলগুলি না খোলাই স্ট্যাটিস করে। বাস্তবে আমি tar cf /dev/null foo*কয়েকটি ফাইল এবং হ্যাঁ, কেবল newfstatat(..., AT_SYMLINK_NOFOLLOW)সিস্টেম কলগুলি দিয়ে পরীক্ষা করেছিলাম এমনকি open()এমনটি এমনও নয় যা এই সময়ের আপডেট করতে পারে। তবে বিশেষত এটি সনাক্ত না করে এমন ঘটতে পারে এমন প্রক্রিয়াগুলি বর্ণনা করার জন্য +1।
পিটার কর্ডেস

এমএমএপ ব্যাখ্যাটি " লিখিত ডেটা অ্যাক্সেস" না করে " পড়ুন ডেটা অ্যাক্সেস " করা উচিত?
ওয়েইন কনরাড

আরও দেখুন splice(2)লিনাক্স। আসলে, বদলে cat > /dev/nullদিয়ে pv -q > /dev/null(যা ব্যবহারের splice()লিনাক্স দিকে) সম্ভবত ভার হ্রাস করা সম্ভব হবে। অথবা dd bs=65536 skip=9999999999 2> /dev/null, অথবা wc -c > /dev/nullবা tail -c1 > /dev/null...
Stéphane Chazelas
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.