Skocz do zawartości

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

voidsn1010

Python2 wyciek pamięci

Rekomendowane odpowiedzi

Cześć,

 

napisałem sobie prosty skrypt w pythonie pod ambient light, niestety mam wyciek w pamięci jakieś 40 Mb/min. Mistrzem w Pythonie nie jestem, co może być nie tak?

 

#!/usr/bin/python -W ignore::DeprecationWarning
import os
import sys
import gtk
import time

screenW = 1920
screenH = 1080
step = 40

pixbuf = None

def get_pixel_rgb(pixbuf, x, y):
pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, 1, 1)
pixbuf.get_from_drawable(gtk.gdk.get_default_root_window(),
						 gtk.gdk.colormap_get_system(),
						 x, y, 0, 0, 1, 1)
return pixbuf.get_pixels_array()[0][0]

print "Ambient Light Started."

stepX = screenW / step
stepY = screenH / step
step2 = step * step

rs, gs, bs = 0, 0, 0
x, y, i = 0, 0, 0

array = []
rgb = []

while True:

array = []

rs, gs, bs = 0, 0, 0

x = 0

while x < step:

	y = 0

	while y < step:

		array.append(get_pixel_rgb(pixbuf, x * stepX, y * stepY))

		y += 1

	x += 1

i = 0

while i < step2:
	rs += array[i][0]
	gs += array[i][1]
	bs += array[i][2]

	i += 1

rgb = [rs / step2, gs / step2, bs / step2]

output = ''.join('{:02x}'.format(c) for c in rgb)

os.system("rivalcfg -c " + output)

time.sleep(0.5)

print "Ambient Light Exited."

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie jestem guru pythona, ale twój kod wydaje się dosyć prosty i nie widzę w nim podstaw do cieknięcia, raczej posądzałbym używane biblioteki PyGTK lub wywołanie przez os.system. Być może w gtk trzeba coś wprost dealokować, ale na szybko nie znalazłem co by to mogło być. Możesz łatwo zrezygnować ze zmiennej "array" i liczyć sumy rgb od razu w pętli, ale nie sądzę by to było źródłem problemu. Na początek zacząłbym od testów bez użycia gtk (np. zwracać jakieś predefiniowane albo losowe wartości) a potem zakomentować os.system i porównać zachowanie programu. Jak to nic nie wyjaśni to narzędzia pod badanie wycieków, ale tu nic nie polecę z własnego doświadczenia.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ew. pixbuf.

 

Czym sprawdzasz wyciek?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Sprawdziłem przez komentowanie i wstępnie wyszło, że pixbuf.get_from_drawable() robi wyciek. Być może faktycznie trzeba coś dealokować, próbowałem też usuwać pixbufa i odpalać gc.collect() ale nie pomogło. Jutro przepiszę to na Pythona 3, może problem sam się rozwiąże.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

2003

The following were closed without patches:

 

[bug 121367] Changed - Memory Leak in GdkPixbuf.get_from_drawable()

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

2003

The following were closed without patches:

 

[bug 121367] Changed - Memory Leak in GdkPixbuf.get_from_drawable()

 

Aha, czyli ktoś zostawił buga bez patcha i nara, męczcie się.. :E

 

Próbowałem to dzisiaj przepisać na Py3 ale wyszła mi jakaś kaszana w tym kodzie i zostałem przy Py2 z resetem programu po n-przejściach głównej pętli.

 

Swoją drogą ciekawy efekt mi z tego wyszedł, aczkolwiek trochę słabo zoptymalizowany. :kwasny:

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

"poczekaj" ;)

jak dalej jest ucieczka pamięci, to może pomysł taki: ubić pixbufa przed returnem? coś jak image_destroy w php?

 

widzę w guglu, że ludzie jadą malinką i xbmc

 

nie ma w gdk jakiejś funkcji, która z całego obrazu da od razu średnią? albo chociaż z linii?

 

i jeszcze jedno, bawienie się arrayem nie jest konieczne; do wzięcia średniej można użyć dwóch zmiennych: sumę + liczbę elementów

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie mam już funkcji, tylko wszystko w pętli, jednak nie znalazłem nic w dokumentacji na temat ubicia pixbufa, a tak jak wcześniej pisałem np. takie coś nic nie daje:

del pixbuf

gc.collect()

 

'Restartowanie' skryptu też nie było dobrym pomysłem, bo proces rodzic nie kończy się po uruchomieniu procesu dziecka i mam drabinkę procesów: http://devlider.com/share/python2.jpg. :hmm:

 

Tego czy jest jakaś średnia w bibliotece to nie wiem, ale obecnie używam mediany, bo mam wrażenie, że lepiej odwzorowuje wartości średnie i tym samym kolor.

 

Zauważyłem, że najbardziej spowalniające jest uruchomienie polecenia za pomocą os.system(), szukam sposobu jak to 'wystrzelić' bez czekania na rezultat i pójście programem dalej.

 

A z malinką wychodzę z założenia, że po co mieć dwa komputery jak można mieć jeden.

 

EDIT: Przepisałem na Py3 i po problemie.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

  • Tematy

  • Odpowiedzi

    • Świetne rady, autor tematu gra w 3440x1440, więc jakim cudem warto zmieniać 4070Ti na 4070Ti Super, skoro premiera RTX 5000 jest tak nieodległa ? Zanim braknie mu 12GB VRAM w tej rozdzielczości to będzie premiera RTX 6000. Więc @andriejek69 jak masz zmieniać teraz kartę to albo coś dużo mocniejszego, albo czekaj na nowe RTXy. Chyba, że faktycznie chcesz pograć w Cyberpanka z Path Tracingiem, ale tam nawet 4070Ti Super z 16GB to będzie za mało. Zrobisz ja uważasz, ale osobiście uważam taką zmanię za kompletnie bezsensowną, bo obecna kara Ci wystarczy do tej rozdzielczości, a jak zmieniać to na 4090, żeby faktycznie poczuć różnicę, teraz dostaniesz 10% to wydajności. Jedyna opcja to sprzedaż obecnej karty za dobrą cenę i niewielka dopłata.
    • Trudne się wylosowało... Monitorów z tunerem jest jak na lekartwo a szybszych niz 60hz tym bardziej. Nie ma mowy też o oledzie ani miniledzie z tunerem chyba że chodzi o telewizor to już prędzej coś znajdziesz.  Nie podałeś specyfikacji swojego komputera to też niezbyt można powiedzieć czy poradzi sobie z monitorem 4k np. (Samsung monitor m7 i m8) mają smart tv ale tunera już nie mają... Dodatkowo są na matrycy VA co nie każdemu może przypaść do gustu. Najlepszym rozwiązaniem będzie kupno możliwie najlepszego monitora na miniledzie/oled (jeżeli nadal mówimy o budżecie 4000zł) i jakiegoś smartboxa (googletv) z tunerem i podłączenie go do monitora poprzez HDMI.
    • Witam Proszę o ocenę zestawu do grania w 1440p i ewentualne propozycje zmian, chciałabym żeby wszystko zamknęło się w 7tys. Preferuję połączenie Intel/Nvidia, najlepiej jak najmniej RGB, dyski już posiadam (2 SSD Sata). Procesor i5 14600KF Karta Gigabyte GeForce RTX 4070 Super Windforce OC 12GB Płyta główna MSI B760 Gaming Plus WIFI lub MSI MAG B760 Tomahawk WIFI (wcześniej rozważałam również Gigabyte B760 Gaming X AX) Zasilacz Seasonic Focus GX - 750W Lexar Ares RGB 32GB 6400MHz CL32 Obudowa Genesis Irid 505F Z chłodzeniem mam problem, ponieważ chciałam zakupić Deepcool'a AK620, jednak nie jest dostępny w sklepie komputronika (sklep wybrałam ze względu możliwości odbioru komputera w moim mieście). Niestety ten ma dość ograniczony wybór chłodzeń. Tak samo jak widać mocno zastanawiam się nad płytą główną, jestem otwarta na propozycje.
    • https://www.rtings.com/monitor/learn/research/vrr-flicker  
    • Ja czego nie rozumiem? No ja rozumiem jaka jest różnica pomiędzy odbiornikiem prądu a generatorem. Z tego co widzę hybrydy się zgłasza. Czy Ci się to podoba czy nie. To nie jest offgrid.  Tak samo jak magazyn energii. Mimo iż ludzie używają je wewnątrz domu, to muszą być zgłaszane.  To że chińczyk mówi, że falownik nie wysyła nadmiaru energii poza sieć nie ma żadnego znaczenia jeśli podepniesz to do sieci.  Czy na rondo nie ma liczników? Na enmasz umowy tam z energetyka? Nie da się zamontować normalnej instalacji? Co powiedział Ci dostawca prądu? Jeśli sąsiada z działki wywali choćby radio na drugi tydzień po montażu Twojego lewego PV, to spodziewaj się problemów.  Jak udowodnił aż że Twój chiński szajs jest przekozak wówczas? Będziesz miał na to jakieś papiery?  Ze specyfiki pracy jaką oczekujesz. Ta sama zasada działania Cię interesuje. Będziesz szukał paneli gruntowych? A czym różnią się takie od paneli dachowych albo balkonowych? Zestaw balkonowy to jest to co szukać powinieneś. Bo zestawów RODo nie robi a raczej?  Zacznijmy od tego, że zacząłeś od złej strony, bo zamiast falownika i budowania hybrydy, podpina się takie rzeczy prosto w panele. Pompa na prąd stały o szerokim napięciu działania pyrka sobie jak ma napięcie i tyle. 
  • Aktywni użytkownicy

×
×
  • Dodaj nową pozycję...