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

C#-এ অবজেক্ট পুল (Object Pool): রিসোর্স অপ্টিমাইজেশন

অবজেক্ট পুল হল একটি সফটওয়্যার প্যাটার্ন যা লিমিটেড বা এক্সপেনসিভ রিসোর্স (ডাটাবেস কানেকশন, থ্রেড, বড় অবজেক্ট) পুনঃব্যবহার করে পারফরম্যান্স বেড়ায়।

কিভাবে কাজ করে

  1. অ্যাক্টিভেশন: পুল থেকে অবজেক্ট নেওয়া (Acquire)
  2. ডিঅ্যাক্টিভেশন: ব্যবহার শেষে পুলে ফেরত দেওয়া (Release)

.NET-এ বিল্ট-ইন সাপোর্ট

  • System.EnterpriseServices.ObjectPoolingAttribute (COM+ সার্ভিসড কম্পোনেন্টের জন্য)
  • ArrayPool<T> (System.Buffers) — অ্যারে পুলিং-এর জন্য
  • MemoryPool<T> — মেমরি বাফার পুলিং
  • থার্ড-পার্টি: Microsoft.Extensions.ObjectPool (ASP.NET Core-এ ব্যবহৃত)

ArrayPool উদাহরণ (সাম্প্রতিক .NET)


using System;
using System.Buffers;

class ArrayPoolDemo
{
    static void Main()
    {
        var pool = ArrayPool<byte>.Shared;
        
        // ১KB বাফার ভাড়া নিন
        byte[] buffer = pool.Rent(1024);
        try
        {
            // বাফার ব্যবহার করুন
            buffer[0] = 0xFF;
            Console.WriteLine("বাফার ব্যবহার করা হয়েছে");
        }
        finally
        {
            // অবশ্যই রিটার্ন করুন
            pool.Return(buffer);
        }
    }
}

কাস্টম Object Pool (Microsoft.Extensions.ObjectPool)


// NuGet: Microsoft.Extensions.ObjectPool
using Microsoft.Extensions.ObjectPool;

public class ExpensiveResource : IDisposable
{
    public int Id { get; }
    public ExpensiveResource(int id) { Id = id; Console.WriteLine($"Created {Id}"); }
    public void Dispose() => Console.WriteLine($"Disposed {Id}");
}

class CustomPoolDemo
{
    static void Main()
    {
        var pool = new DefaultObjectPool<ExpensiveResource>(
            new PooledObjectPolicy<ExpensiveResource>()
        );
        
        var obj1 = pool.Get(); // Create 1
        var obj2 = pool.Get(); // Create 2
        pool.Return(obj1);
        var obj3 = pool.Get(); // Reuse 1
    }
}

কখন ব্যবহার করবেন

  • অবজেক্ট তৈরি করা ব্যয়বহুল (DB কানেকশন, SSL সокেট, বড় বাফার)
  • উচ্চ ফ্রিকোয়েন্সি 앨োকেশন/ডি-অ্যালোকেশন (গেমিং, রিয়েল-টাইম)
  • গারবেজ কलेক্টর প্রেশার কমাতে চাইলে

সতর্কতা

  • পুল থেকে নেওয়া অবজেক্ট Reset বা ক্লিয়ার করতে হয় (স্টেট লিক এড়াতে)।
  • IDisposable অবজেক্ট পুলিং-এ সতর্কতা অবশ্যক।
  • মেমরি লিক এড়াতে Return নিশ্চিত করুন (using প্যাটার্ন বা try/finally)।
  1. C#-এ অবজেক্ট ডেটা টাইপ (Object Data Types) কী

  2. C#-এ IStructuralComparable ইন্টারফেস কী কাজ করে?

  3. Matplotlib Axes অবজেক্ট কী এবং এর কাজ

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