Python sekme değiştirince ram temizleme

merhaba pyqt5 ui bir projem var ve 1-2-3-4 numaralı sayfalar arasında gezerken her sayfa değiştirdiğimde kullanılan ram miktarı artıyor bende sayfadan sayfaya geçerken rami temizlemek gibi bir şey istiyorum mümkün mü yada bu gereksiz artma olayını nasıl düzeltirim

Muhtemelen;
https://docs.python.org/3/library/gc.html

https://sourceexample.com/article/en/2a5f7e8460daa23d12e07b8c6adb8275/

şöyle birşey buldum ama tam olarak ne yapmalıyım bilemedim

Bu dosyalarla (disk) alakali, RAM (hafiza) ile degil.

Kodda bir hata olabilir. (bkz: Soru Sorarken Sıkça Düşülen Hatalar #5)

Hangi olcumlere gore?

Kodu duzelterek. Ama her artma gereksiz degil.

image

kodun tamamını atmak isterdim hocam bende inanın ne sizi yormayı isterim nede soruma cevap bulamamayı , sayfalar arası geçiş yapınca görev yöneticisinden baktığım verilere göre ram artışı olduğunu gördüm bu artış ben her sayfa arasında geçiş yaptıkça devam ediyor

Kodun tamamini atmamak daha cok yoruyor genelde :slight_smile:

Sorun degil ama, genel bir soru olarak ele alirsak:

  1. Windows gorev yoneticisi bir hafiza olcme aleti degil. En onemlisi, ne olctugunu bilmiyorum. Programin istedigi ve kullandigi hafizadan baska bir sey olabilir. Process Explorer, veya en azindan sagdaki tablardaki hafizayla ilgili kolonlar daha cok bilgi verebilir. Herhangi bir hafiza olcme aleti de.

100 kere sayfa gecisi yapinca 100 kere artiyor mu? O zaman gereksiz objeler yaratilip garbage collect edilmeleri engelleniyor olabilir.

  1. @mehmetB yazinca gc modulune baktim. Garbage collector’un nasil calistigini bilen insanlar icin son derece ise yarar debug bilgileri alinabiliyor gibi gozukuyor. Obje leak’i oldugundan emin olduktan sonra buradan hangi objeler olduguna bakilabilir gibi.

  2. 30-40 MB hafiza kullanimindan bahsediyorsak degismeler dildeki objelere tekabul etmeyebilir. Mesela kutuphane tarafindan yaratilan bir arkaplan thread’ine 1 MB stack ayrilabilir, bunun icin de 4 MB’lik bir buyuk sayfa kullanilabilir. (Windows’un, Qt’nin, PyQt’nin, Python’un calisma detaylarini bilmiyorum. Ciddi bir sorun olsa yukaridaki incelemelerden sonra buraya bulasilabilir fakat birkac MB icin degmez. 29.1 MB’i yukari yuvarladiginda bile %3 fark oluyor, oyle dusun.)

1 Beğeni

100 kere sayfa geçişi yapmadım ama 10-20 kere yaptım artıyor yani daha fazlasını deneyimi hocam

hangi objeler leak oluyor direk sayfamı leak oluyor nasıl anlıycam orasını biraz aklımı karıştırdı bi temiz proje açıp sadece 2 boş sayfa arasında geçiş yaptırıcam gene olursa demeki sayfalar arasında yada bizim sayfalar arasında yaptığımız geçişte bir sorun var gibi

1 Beğeni
#testter.py
from PyQt5 import QtCore, QtGui, QtWidgets
from test import Ui_test31


class Ui_test2(object):
    def denemeac(self):
        self.window = QtWidgets.QMainWindow()
        self.ui = Ui_test31() 
        self.ui.setupUi(self.window)
        self.window.show()
        self.deneme3.close()    



    def setupUi(self, test2):
        self.deneme3 = test2
        test2.setObjectName("test2")
        test2.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(test2)
        self.centralwidget.setObjectName("test2")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(350, 290, 75, 23))
        self.pushButton.setObjectName("pushButton")
        test2.setCentralWidget(self.centralwidget)

        self.retranslateUi(test2)
        QtCore.QMetaObject.connectSlotsByName(test2)


        self.pushButton.clicked.connect(self.denemeac)

    def retranslateUi(self, test2):
        _translate = QtCore.QCoreApplication.translate
        test2.setWindowTitle(_translate("test2", "MainWindow"))
        self.pushButton.setText(_translate("test2", "gonder2"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    test2 = QtWidgets.QMainWindow()
    ui = Ui_test2()
    ui.setupUi(test2)
    test2.show()
    sys.exit(app.exec_())
#test.py
from PyQt5 import QtCore, QtGui, QtWidgets



class Ui_test31(object):
    def testerac(self):
        from testter import Ui_test2
        self.window = QtWidgets.QMainWindow()
        self.ui = Ui_test2() 
        self.ui.setupUi(self.window)
        self.window.show()
        self.deneme2.close()



    def setupUi(self, test31):
        self.deneme2 = test31
        test31.setObjectName("test31")
        test31.resize(800, 600)
        self.test31 = QtWidgets.QWidget(test31)
        self.test31.setObjectName("test31")
        self.pushButton = QtWidgets.QPushButton(self.test31)
        self.pushButton.setGeometry(QtCore.QRect(370, 290, 75, 23))
        self.pushButton.setObjectName("pushButton")
        test31.setCentralWidget(self.test31)

        self.retranslateUi(test31)
        QtCore.QMetaObject.connectSlotsByName(test31)

        self.pushButton.clicked.connect(self.testerac)

    def retranslateUi(self, test31):
        _translate = QtCore.QCoreApplication.translate
        test31.setWindowTitle(_translate("test31", "MainWindow"))
        self.pushButton.setText(_translate("test31", "gonder"))



if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    test31 = QtWidgets.QMainWindow()
    ui = Ui_test31()
    ui.setupUi(test31)
    test31.show()
    sys.exit(app.exec_())

hocam şöyle yaptım fakat halen kullanılan ram miktarı artıyor birde siz bakarmısınız

1 Beğeni

Evet. Her seferinde yeni bir QMainWindow yaratildigi icin hafiza kullanimi artiyor ve azalmiyor.

Muhtemelen QMainWindow bir tane yaratilmak icin tasarlandigi icin.

bir parametre ver hangi kısmı temizlemek istiyorsan daha sonra clear yaz örnek ui.tbltablo.clear() böyle yazarsan temizlenir ben bunda temizleme işlemi görüyorum yardımcı olabilmişimdir umarım.

A ben her sayfa için main window kullandım acaba wiget kullansaydım böyle birşey olmazdı heralde deniycem bunu müsait bir zamanda burayada yazıcam hocam

rica etsem örnek olarak yukardaki attığım kodlara uygulayıp atmanız mümkünmü hocam

Normalde bir adet MainWindow’u tutup icini degistirmek gerekiyor.

(Yukaridakinden bagimsiz olarak) butun GUI elementlerini bir kere yaratip gerektikce gosterip/saklamak gerekiyor. Her seferinde yeniden yaratmak hic bir kutuphanenin verimli calistigi nokta degil.

bunu nasıl yapıcağımı açıkcası bilmiyorum nasıl yaparız örnek göstermeniz mümkünmü yada kaynak

Saçma sapan değişken isimleri koydun beni kaybettin. Adabı vardır yazılımla ilgilenmenin, önce kime yazdığını bileceksin, sonra kiminle yazdığını…

test1 test2 yapmıştım qt den test1 yapıp convert edince test3_1 çıktı bende aradaki _ yi sildim burda tek takıldın şey ordaki 31 se yazık sana kardeşim

1 Beğeni

Kusura bakmayın mesajınızı geç gördüm işten dolayı yoğunum bugün akşam yapıp size gönderirim uygun mudur.

olur hocam acelesi yok size nasıl uygunsa teşekkürler

bakabildinizmi hocam