এরিকসুন প্রশ্নের উত্তর # 1 দিয়েছেন, এবং আমি # 3 প্রশ্নের উত্তর দিয়েছি (আসল # 4), তবে এখন আসুন প্রশ্নের উত্তর # 2:
এটি কেন বিশেষত 50.5mb প্রকাশ করে - এর ভিত্তিতে প্রকাশিত পরিমাণটি কী?
এটি কী ভিত্তিতে ভিত্তি করে তা হ'ল, পাইথনের অভ্যন্তরে একটি সম্পূর্ণ সিরিজ এবং malloc
এটি পূর্বাভাস দেওয়া খুব কঠিন।
প্রথমত, আপনি কীভাবে মেমরি পরিমাপ করছেন তার উপর নির্ভর করে আপনি কেবল মেমরিতে ম্যাপ করা পৃষ্ঠাগুলি পরিমাপ করতে পারেন। সেক্ষেত্রে যে কোনও সময় পেজারের দ্বারা কোনও পৃষ্ঠা মুছে ফেলা হলে, স্মৃতিটি "মুক্ত" হিসাবে প্রদর্শিত হবে, যদিও তা মুক্ত হয়নি।
অথবা আপনি ব্যবহারযোগ্য পৃষ্ঠাগুলি পরিমাপ করছেন, যা বরাদ্দকৃত-তবে-কখনও-স্পর্শ হওয়া পৃষ্ঠাগুলি (লিনাক্সের মতো আশাবাদীভাবে অতিরিক্ত বরাদ্দ হওয়া সিস্টেমগুলিতে), বরাদ্দ করা হলেও ট্যাগ হওয়া পৃষ্ঠা MADV_FREE
ইত্যাদি গণনা করতে পারে বা নাও পারে etc.
যদি আপনি সত্যিকার অর্থে বরাদ্দকৃত পৃষ্ঠাগুলি পরিমাপ করে থাকেন (যা আসলে করা খুব দরকারী জিনিস নয় তবে এটি যা আপনি জিজ্ঞাসা করছেন তা মনে হয়), এবং পৃষ্ঠাগুলি সত্যই নির্মূল করা হয়েছে, এটি দুটি ঘটনায় ঘটতে পারে: হয় আপনি " ব্যবহৃত ve brk
বা সমমানের তথ্য সেগমেন্ট (খুব বিরল আজকাল) সঙ্কুচিত, অথবা আপনি ব্যবহার করেছি munmap
বা অনুরূপ একটি ম্যাপ সেগমেন্ট মুক্তি। (তাত্ত্বিকভাবে পরেরটির একটি ছোটখাটো রূপও রয়েছে, এতে ম্যাপযুক্ত বিভাগের অংশ প্রকাশ করার উপায় রয়েছে যেমন you যেমনটি আপনি অবিলম্বে আনম্যাপ করে এমন MAP_FIXED
একটি MADV_FREE
বিভাগের জন্য এটি চুরি করুন ))
তবে বেশিরভাগ প্রোগ্রামগুলি মেমরির পৃষ্ঠা থেকে সরাসরি জিনিস বরাদ্দ করে না; তারা একটি malloc
স্টাইল বরাদ্দকারী ব্যবহার করে । আপনি যখন কল করবেন free
, বরাদ্দকারী কেবলমাত্র ওএস-এ পৃষ্ঠাগুলি প্রকাশ করতে পারে যদি আপনি free
ম্যাপিংয়ে (বা ডেটা বিভাগের শেষ এন পৃষ্ঠাগুলিতে) সর্বশেষ লাইভ অবজেক্টটি আইং করে যাচ্ছেন। আপনার অ্যাপ্লিকেশনটি যথাযথভাবে এটি পূর্বাভাস দিতে পারে না, বা এটি এটি আগে থেকেই ঘটেছে তা সনাক্ত করতে পারে না।
সিপিথন এটিকে আরও জটিল করে তোলে। এর উপরে একটি কাস্টম মেমরি বরাদ্দকারী শীর্ষে একটি কাস্টম 2-স্তরের অবজেক্ট বরাদ্দকারী রয়েছে malloc
। ( আরও বিশদ ব্যাখ্যার জন্য উত্সের মন্তব্যগুলি দেখুন )) এবং তার উপরে, এমনকি সিআই এপি স্তরে, পাইথনটিও কম, শীর্ষ-স্তরের অবজেক্টগুলি ধ্বংস হয়ে গেলে আপনি সরাসরি নিয়ন্ত্রণও করতে পারবেন না।
সুতরাং, আপনি যখন কোনও বস্তু প্রকাশ করবেন, তখন আপনি কীভাবে জানবেন যে এটি ওএসে মেমরি প্রকাশ করবে কিনা? ঠিক আছে, প্রথমে আপনাকে জানতে হবে যে আপনি শেষ রেফারেন্স প্রকাশ করেছেন (কোনও অভ্যন্তরীণ রেফারেন্স সহ যা সম্পর্কে আপনি জানতেন না), জিসি এটি হ্রাস করতে দেয়। (অন্যান্য বাস্তবায়নের বিপরীতে, কমপক্ষে সিপথন কোনও বস্তুর অনুমতি দেওয়ার সাথে সাথেই এটি বিচ্ছিন্ন করে দেবে)) এটি সাধারণত পরবর্তী স্তরে কমপক্ষে দুটি জিনিস নিচে ফেলে দেয় (উদাহরণস্বরূপ, একটি স্ট্রিংয়ের জন্য, আপনি PyString
অবজেক্টটি প্রকাশ করছেন , এবং স্ট্রিং বাফার) )।
আপনি যদি না একটি বস্তু ডি-এলোকেট জানতে কিনা এই বস্তুর সঞ্চয়ের একটি ব্লক ডি-এলোকেট করতে পরবর্তী স্তরে নেমে কারণ, আপনি বস্তুর বরাদ্দকরণ অভ্যন্তরীণ স্থিতি জানতে, পাশাপাশি তা কিভাবে কার্যকর হচ্ছে হিসাবে আছে। (আপনি যদি ব্লকের শেষ জিনিসটিকে অবনমিত না করেন তবে স্পষ্টতই এটি ঘটতে পারে না এবং তারপরেও এটি ঘটে না))
আপনি যদি না বস্তুর সঞ্চয়ের একটি ব্লক ডি-এলোকেট জানতে এই একটি কারণ কিনা free
কল, আপনি PyMem বরাদ্দকরণ অভ্যন্তরীণ স্থিতি জানতে, পাশাপাশি তা কিভাবে কার্যকর হচ্ছে হিসাবে আছে। (আবার, আপনাকে কোনও malloc
এড অঞ্চলে সর্বশেষ ব্যবহারের ব্লকটি বাতিল করতে হবে, এবং তারপরেও এটি নাও হতে পারে))
আপনি যদি না free
একটি malloc
ইডি অঞ্চল, জানতে এই একটি কারণ কিনা munmap
বা সমমানের (অথবা brk
), আপনি অভ্যন্তরীণ স্থিতি জানা আছে malloc
যে, তা কিভাবে বাস্তবায়ন হচ্ছে সেইসাথে। এবং এটি অন্যদের থেকে পৃথক, অত্যন্ত প্ল্যাটফর্ম-নির্দিষ্ট। (এবং আবারও, আপনাকে সাধারণত malloc
কোনও mmap
বিভাগের মধ্যে শেষের ব্যবহারকে কমিয়ে আনতে হবে এবং তারপরেও এটি নাও হতে পারে))
সুতরাং, যদি আপনি বুঝতে চান যে কেন এটি ঠিক ৫০.৫ মিমি প্রকাশের কারণে ঘটেছিল, আপনাকে নীচের দিক থেকে এটি সন্ধান করতে চলেছেন। malloc
আপনি যখন এই এক বা একাধিক free
কল করেছেন (সম্ভবত 50.5mb এর চেয়ে কিছুটা বেশি) তখন কেন 50.5mb মূল্যমানের পৃষ্ঠা আনম্যাপ করবেন? আপনাকে আপনার প্ল্যাটফর্মটি পড়তে হবে malloc
এবং তার বর্তমান অবস্থা দেখতে বিভিন্ন টেবিল এবং তালিকাগুলি হাঁটাতে হবে। (কিছু প্ল্যাটফর্মে, এটি এমনকি সিস্টেম-স্তরের তথ্যও ব্যবহার করতে পারে, যা অফলাইনে পরিদর্শন করার জন্য সিস্টেমের স্ন্যাপশট তৈরি না করে ক্যাপচার করা বেশ অসম্ভব, তবে ভাগ্যক্রমে এটি সাধারণত কোনও সমস্যা নয়)) এবং তারপরে আপনাকে হতে হবে তার উপরে 3 স্তরে একই জিনিস করুন।
সুতরাং, প্রশ্নের একমাত্র দরকারী উত্তর "কারণ"।
আপনি যদি রিসোর্স-সীমাবদ্ধ (যেমন, এম্বেডেড) বিকাশ না করে থাকেন তবে আপনার এই বিবরণগুলির যত্ন নেওয়ার কোনও কারণ নেই।
এবং যদি আপনি হয় রিসোর্স-সীমাবদ্ধ উন্নয়ন করছেন, এই বিবরণ বুদ্ধিমান অনর্থক; mmap
অ্যাপ্লিকেশন স্তরে আপনার সম্ভবত প্রয়োজনীয় সমস্ত স্তরের এবং বিশেষত মেমরির (আপনার মধ্যে সম্ভবত একটি সাধারণ, সু-বোঝা, অ্যাপ্লিকেশন-নির্দিষ্ট জোন বরাদ্দকারী এর সাথে) আপনাকে প্রায় শেষ করতে হবে।