Python'da Xotira Boshqaruvi

Python'da obyektlar, xotira ajratish, axlat yig'uvchi, referens hisoblash va xotira sizib chiqishi haqida bilib oling.

So'nggi yangilanish: 2024-12-20

Python yuqori darajali dasturlash tili bo'lib, u avtomatik xotira boshqaruvi bilan mashhur. Bu xususiyat dasturchilarni ko'p texnik tafsilotlardan xalos qiladi, ammo xotira boshqaruvini tushunish samarali va xatosiz dasturlar yaratish uchun juda muhimdir. Ushbu qo'llanma Python'da xotira boshqaruvining asosiy tushunchalarini, mexanizmlarini va eng yaxshi amaliyotlarini qamrab oladi.

Python'da Xotira Boshqaruvi Asoslari

Python'da xotira boshqaruvi asosan avtomatik tarzda amalga oshiriladi. Bu jarayon quyidagi asosiy tushunchalarni o'z ichiga oladi:

  1. Dinamik xotira ajratish: Python obyektlar uchun xotirani dinamik ravishda ajratadi.
  2. Axlat yig'ish(Garbage Collection): Foydalanilmayotgan obyektlarni avtomatik aniqlash va o'chirish.
  3. Referens hisoblash: Har bir obyektga bo'lgan referenslar sonini kuzatib borish.

Obyektlar va Xotira

Python'da hamma narsa obyektdir. Har bir obyekt xotirada o'z joyiga ega:

x = 5  # Butun son obyekti
y = "Salom"  # Satr obyekti

print(id(x))  # x obyektining xotiradagi manzili
print(id(y))  # y obyektining xotiradagi manzili

Xotira Ajratish va Bo'shatish

Python xotirani avtomatik ravishda ajratadi va bo'shatadi:

def xotira_ajratish():
    a = [1, 2, 3]  # Ro'yxat uchun xotira ajratiladi
    print(f"a obyektining xotira manzili: {id(a)}")

xotira_ajratish()
# Funksiya tugagandan so'ng, 'a' ro'yxati uchun ajratilgan xotira bo'shatiladi

Axlat Yig'uvchi (Garbage Collector)

Python'ning axlat yig'uvchisi foydalanilmayotgan obyektlarni aniqlaydi va xotiradan o'chiradi:

import gc

gc.disable()  # Axlat yig'uvchini o'chirish
# Kodni bajarish
gc.collect()  # Qo'lda axlat yig'ishni boshlash
gc.enable()   # Axlat yig'uvchini yoqish

Referens Hisoblash

Python har bir obyekt uchun referenslar sonini kuzatib boradi:

import sys

a = []
b = a
print(sys.getrefcount(a) - 1)  # 2 (a va b referenslari)

del b
print(sys.getrefcount(a) - 1)  # 1 (faqat a referensi)

Siklik Referenslar va Ularni Hal Qilish

Siklik referenslar xotira sizib chiqishiga olib kelishi mumkin:

import gc

class Node:
    def __init__(self):
        self.referens = None

node1 = Node()
node2 = Node()
node1.referens = node2
node2.referens = node1

del node1
del node2

gc.collect()  # Siklik referenslarni aniqlash va o'chirish

Xotira Sizib Chiqishi (Memory Leaks)

Xotira sizib chiqishi uzoq vaqt davomida ishlatiladigan dasturlarda muammo bo'lishi mumkin:

import gc

def xotira_sizib_chiqishi():
    katta_royxat = [0] * 1000000
    return lambda: sum(katta_royxat)

hisoblash = xotira_sizib_chiqishi()
del xotira_sizib_chiqishi

# 'katta_royxat' hali ham xotirada, chunki 'hisoblash' funksiyasi uni ishlatadi
gc.collect()  # Bu yerda xotira bo'shatilmaydi

Xotiradan Samarali Foydalanish

Xotiradan samarali foydalanish uchun ba'zi usullar:

# Generator funksiyalardan foydalanish
def katta_royxat_generatori(n):
    for i in range(n):
        yield i

for item in katta_royxat_generatori(1000000):
    # Har bir element bilan ishlash
    pass

# Xotiradan tejamkor ma'lumotlar tuzilmalaridan foydalanish
from array import array

sonlar_massivi = array('i', [1, 2, 3, 4, 5])  # 'i' - butun sonlar uchun

Katta Ma'lumotlar To'plamlari bilan Ishlash

Katta ma'lumotlar to'plamlari bilan ishlashda xotirani boshqarish:

import pandas as pd

# Katta CSV faylni qism-qism o'qish
for chunk in pd.read_csv('katta_fayl.csv', chunksize=10000):
    # Har bir qism ustida amal bajarish
    process_chunk(chunk)

def process_chunk(chunk):
    # Qism ustida amallar bajarish
    pass

Xotira Profillash

Python dasturlarining xotira foydalanishini tahlil qilish:

from memory_profiler import profile

@profile
def xotira_talab_funksiya():
    katta_royxat = [0] * 1000000
    del katta_royxat

xotira_talab_funksiya()

Eng Yaxshi Amaliyotlar

  1. Keraksiz obyektlarni o'chirib tashlang (del operatori yordamida).
  2. Katta ma'lumotlar to'plamlari bilan ishlashda generatorlardan foydalaning.
  3. Xotiradan tejamkor ma'lumotlar tuzilmalarini tanlang.
  4. Muntazam ravishda xotira profillashni o'tkazing.
  5. Siklik referenslardan ehtiyot bo'ling.

Tez-tez Uchraydigan Muammolar va Ularning Yechimlari

  1. Muammo: Katta ro'yxatlar xotirani to'ldiradi. Yechim: Generatorlar yoki iteratorlardan foydalaning.
  2. Muammo: Siklik referenslar tufayli xotira sizib chiqishi. Yechim: weakref modulidan foydalaning yoki ma'lumotlar tuzilmangizni qayta ko'rib chiqing.
  3. Muammo: Uzoq vaqt ishlaydigan dasturlarda xotira foydalanishi oshib boradi. Yechim: Muntazam ravishda gc.collect() ni chaqiring yoki xotira profillashdan foydalaning.

Qo'shimcha Manbalar

  1. Python rasmiy hujjatlari: Xotira boshqaruvi
  2. Real Python: Python Garbage Collection
  3. Python Software Foundation Wiki: Xotira boshqaruvi
  4. PyPy dokumentatsiyasi: Garbage collection
  5. memory-profiler kutubxonasi