না, কোনও ফাইল এটিকে খোলার মাধ্যমে মেমরিটিতে স্বয়ংক্রিয়ভাবে পড়া হয় না। এটি ভয়াবহভাবে অকার্যকর হবে। sed
উদাহরণস্বরূপ, অন্যান্য ইউনিক্স সরঞ্জামগুলির মতো এটির ইনপুট লাইনও লাইনে পড়ে। এটি কদাচিৎ বর্তমান লাইনের চেয়ে স্মৃতিতে বেশি রাখতে হবে।
সঙ্গে awk
এটি একই আছে। এটি একটি সময়ে একটি রেকর্ড পড়ে , যা ডিফল্টরূপে একটি লাইন। আপনি ভেরিয়েবল ইনপুট ডেটা পার্টসের দোকান পারেন, যে অতিরিক্ত, অবশ্যই হতে হবে 1 ।
কিছু লোকের মতো জিনিস করার অভ্যাস থাকে
for line in $(cat file); do ...; done
যেহেতু শেলটি লুপের $(cat file)
এমনকি প্রথম পুনরাবৃত্তি চালানোর আগে কমান্ড প্রতিস্থাপনটিকে পুরোপুরি প্রসারিত করতে হবেfor
, এটি পুরো মেমোরিতে পড়বে (শেলটি লুপ চালানো মেমরিটিতে)। এটি কিছুটা মূর্খ এবং অপ্রয়োজনীয়ও। পরিবর্তে, এক করা উচিতfile
for
while IFS= read -r line; do ...; done <file
এটি file
লাইন দ্বারা লাইন প্রক্রিয়া করবে (তবে "আইএফএস = রিড-আর লাইন" বোঝার জন্য পড়ুন )।
শেলের লাইনে ফাইলগুলি লাইন প্রক্রিয়াকরণ করা খুব কমই প্রয়োজন যদিও বেশিরভাগ ইউটিলিটিগুলি যাইহোক লাইন-ভিত্তিক হয় (দেখুন পাঠকে খারাপ অনুশীলন হিসাবে বিবেচনা করার জন্য শেল লুপটি কেন ব্যবহার করা হচ্ছে? )।
আমি বায়োইনফরম্যাটিকসে কাজ করছি এবং বিপুল পরিমাণ জিনোমিক ডেটা প্রক্রিয়াকরণ করার সময় আমি কেবলমাত্র মেমরিতে একেবারে প্রয়োজনীয় ডেটার বিট না রাখলে আমি বেশি কিছু করতে পারতাম না। উদাহরণস্বরূপ, যখন আমার কোনও ভিসিএফ ফাইলে ডিএনএ ভেরিয়েন্টযুক্ত 1 টেরাবাইট ডেটাসেটের ব্যক্তিদের সনাক্ত করতে ব্যবহার করা যেতে পারে এমন ডেটার বিটগুলি সরিয়ে ফেলতে হবে (কারণ এই ধরণের ডেটা জনসম্মুখে প্রকাশ করা যায় না), আমি লাইন দিয়ে লাইনে করি একটি সাধারণ awk
প্রোগ্রামের সাথে প্রক্রিয়াজাতকরণ (ভিসিএফ ফর্ম্যাটটি লাইন-ভিত্তিক হওয়ায় এটি সম্ভব)। আমি মেমরিটিতে ফাইলটি পড়ি না , এটি প্রক্রিয়া করে সেখানে আবার লিখি! যদি ফাইলটি সংকুচিত করা হত, তবে আমি এটিকে মাধ্যমে ফিড করব zcat
বা gzip -d -c
, যেহেতু gzip
, ডেটা প্রবাহের প্রক্রিয়াকরণ থেকে, পুরো ফাইলটি মেমরিতে পড়বে না।
এমনকি JSON বা XML এর মতো লাইন ভিত্তিক নয় এমন ফাইল ফর্ম্যাটগুলির সাথেও স্ট্রিম পার্সার রয়েছে যা র্যামের মধ্যে সমস্ত সংরক্ষণ না করেই বিশাল ফাইলগুলি প্রক্রিয়া করা সম্ভব করে।
এক্সিকিউটেবলের সাথে, ভাগ করা লাইব্রেরিগুলি চাহিদা অনুসারে লোড হতে পারে এবং / বা প্রক্রিয়াগুলির মধ্যে ভাগ করা যেতে পারে ( উদাহরণস্বরূপ ভাগ করা লাইব্রেরি এবং র্যাম ব্যবহারের লোড দেখুন )।
ক্যাশে করা এমন কিছু যা আমি এখানে উল্লেখ করি নি। এই তথ্যটি প্রায়শই অ্যাক্সেস করা টুকরো রাখা র্যাম ব্যবহারের ক্রিয়া। ক্ষুদ্রতর ফাইলগুলি (উদাহরণস্বরূপ এক্সিকিউটেবল) ওএসের সাহায্যে ক্যাশ করা যেতে পারে এই আশায় যে ব্যবহারকারী তাদের কাছে অনেকগুলি রেফারেন্স তৈরি করবে। ফাইলটির প্রথম পড়া ছাড়াও পরবর্তী অ্যাকসেসগুলি ডিস্কের পরিবর্তে র্যামে করা হবে। ক্যাচিং, যেমন ইনপুট এবং আউটপুট বাফারিং সাধারণত ব্যবহারকারীর কাছে অনেকাংশে স্বচ্ছ হয় এবং জিনিসগুলি ক্যাশে করতে ব্যবহৃত মেমরির পরিমাণ অ্যাপ্লিকেশন ইত্যাদির দ্বারা বরাদ্দ হওয়া র্যামের পরিমাণের উপর নির্ভর করে পরিবর্তনশীল পরিবর্তন হতে পারে etc.
1 প্রযুক্তিগতভাবে, বেশিরভাগ প্রোগ্রাম সম্ভবত স্পষ্টভাবে বাফারিং ব্যবহার করে বা স্পষ্টভাবে স্ট্যান্ডার্ড I / O লাইব্রেরিগুলি করে এমন বাফারিংয়ের মাধ্যমে একযোগে ইনপুট ডেটা পড়ে থাকে এবং তারপরে সেই খণ্ড লাইনটি ব্যবহারকারীর কোডে লাইনে উপস্থাপন করে। উদাহরণস্বরূপ, একবারে অক্ষরের চেয়ে ডিস্কের ব্লক আকারের একাধিকটি পড়ার পক্ষে এটি আরও দক্ষ। এই খণ্ড আকারটি যদিও কয়েক মুঠো কিলোবাইটের তুলনায় খুব কমই বড় হবে।