কম্পিউটার টিউটোরিয়াল

পাইথনে গার্বেজ কালেকশন: মেমরি ম্যানেজমেন্ট বোঝা


পাইথন মেমরি ম্যানেজমেন্ট সহজ এবং সরল। মেমরি অ্যালোকেশন এবং ডিঅ্যালোকেশন স্বয়ংক্রিয় হয়ে থাকে, তাই আপনাকে মেমরি ম্যানেজমেন্টের চিন্তা করতে হয় না। এর механиزمগুলির একটি হলো গার্বেজ কালেকশন। গার্বেজ কালেকশনের বিভিন্ন দিক বুঝি:

গার্বেজ কালেকশন কী?

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

পাইথন মেমরি ম্যানেজমেন্টের জন্য দুটি পদ্ধতি ব্যবহার করে:

  • রেফারেন্স কাউন্টিং (Reference Counting)
  • গার্বেজ কালেকশন (Garbage Collection)

পাইথনের গার্বেজ কালেকশন স্বয়ংক্রিয়, কিন্তু কিছু প্রোগ্রামিং ল্যাঙ্গুয়েজে আপনাকে নিজে অবজেক্ট ক্লিন করতে হয়। পাইথনে আপনি চাইলে ম্যানুয়ালি অবজেক্ট ডিলিট করতে পারেন।

>>> x = 9
>>> print(x)
9
>>> del x
>>> print(x)
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    print(x)
NameError: name 'x' is not defined

উপরে আমরা একটি ভেরিয়েবল (x) ডিফাইন করেছি এবং ব্যবহার করেছি। রানটাইমে আমরা অবজেক্টটি ডিলিট করেছি (কারণ পাইথনে সব কিছু অবজেক্ট) এবং আউটপুট দেওয়ার চেষ্টা করেছি।

প্রোগ্রামের প্রথম দুটি লাইনে অবজেক্ট x পরিচিত। কিন্তু অবজেক্ট (x) ডিলিট হওয়ার পর আমরা আর এটা প্রিন্ট করতে পারি না।

উপরের উদাহরণ থেকে দেখা যাচ্ছে যে গার্বেজ কালেকশন সম্পূর্ণ স্বয়ংক্রিয় এবং আমাদের এর জন্য চিন্তা করতে হয় না। আরেকটি উদাহরণ দিয়ে এই কনসেপ্ট বুঝি। পাইথনের প্রতিটি অবজেক্টের (উপরের কোডের অবজেক্ট x-এর মতো) একটি রেফারেন্স কাউন্ট এবং একটি টাইপ পয়েন্টার থাকে।

রেফারেন্স কাউন্টের মান পরিবর্তিত হয় এর ব্যবহার পদ্ধতির উপর নির্ভর করে। উদাহরণস্বরূপ, যদি অবজেক্ট x কে অন্য অবজেক্ট y-র সাথে অ্যাসাইন করি, তবে এর রেফারেন্স কাউন্ট ২ হয়ে যায়।

>>> some_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> # some_list-এর রেফারেন্স কাউন্ট = ১
>>> other_list = some_list
>>> # রেফারেন্স কাউন্ট = ২
>>> # আর্গুমেন্ট হিসেবে পাস করলেও বেড়ে
>>> list_total = sum(some_list)
>>> # লিস্টের ভেতর রাখলেও বেড়ে
>>> list_of_list = [some_list, some_list, some_list]
>>> 
>>> # "some_list" অবজেক্টের রেফারেন্স কাউন্ট চেক করুন
>>> import sys
>>> sys.getrefcount(some_list)
6

উপরে পাইথনে রেফারেন্স কাউন্টিং বোঝার একটি ভালো উদাহরণ। আমরা একটি অবজেক্ট "some_list" তৈরি করলাম (রেফারেন্স কাউন্ট = ১), অন্য অবজেক্টে অ্যাসাইন করলাম (রেফ. কাউন্ট = ২), আর্গুমেন্ট হিসেবে পাস করলাম (রেফ. কাউন্ট = ৩) এবং পরে লিস্টের ভেতর তিনবার রাখলাম (রেফ. কাউন্ট = ৬)। পরে "some_list" অবজেক্টের রেফারেন্স কাউন্ট চেক করলে ৬ পাওয়া গেল।

>>> import sys
>>> sys.getrefcount(some_list)
6
>>> 
>>> del list_of_list
>>> sys.getrefcount(some_list)
3
>>> del some_list
>>> sys.getrefcount(some_list)
Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    sys.getrefcount(some_list)
NameError: name 'some_list' is not defined

  1. পাইথন অবজেক্ট কম্পैरিজন: "is" বনাম "=="

  2. পাইথনে অবজেক্ট ইন্সপেক্টর আছে কি?

  3. পাইথনে গার্বেজ কালেকশন কীভাবে কাজ করে?

  4. পাইথনে TimeTuple কী?