fabek
#programowanie #webdev #nodejs #javascript #opencv #raspberrypi #bananapi

Siema Mirki, mam problem z wyciekiem pamięci na Debianie pod BananaPi. Poniższa funkcja pobiera obrazek z serwera i wykonuje detekcję, działa w pętli i za każdym razem po wykonaniu readImage() zjada 4MB ramu nie zwalniając go. Ktoś ma pomysł dlaczego? Pod nodem nie mogę używać funkcji im.release() jak w c++, czy jest jakiś inny sposób żeby urchonić się przed wyciekami pamięci?

Próbowałem już
1) global.gc() - garbage collector
2) echo 3 >/proc/sys/vm/dropcaches - zwalnienie cachy w systemie (trochę pomaga, ale nie odzyskuje wszystkiego)

download = wget.download(src, path + filename, options);

download.on('end', function(output) {

cv.readImage(path + filename, function(err, im) {
if (err) throw err;
if (im.width() < 1 || im.height() < 1) throw new Error('Image has no size');

im.detectObject('data/cascade.xml', {}, function(err, cars) {
if (err) throw err;

for (var i = 0; i < cars.length; i++) {
car = cars[i];
im.rectangle([car.x, car.y], [car.width, car.height], [0, 255, 0], 2);
}

im.save(path + '_' + filename);

});
});
});

Edit: Sorry za wklejony kod, wykop coś sie popsuł. Jak coś link do PB -> http://pastebin.com/vpBmnrae
  • Najlepsze
  • Wszystkie komentarze
DiKey
@fabek: hmm nie będę tego instalował, więc strzelam: znajdź ten plik na localu https://github.com/peterbraden/node-opencv/blob/0374115c729f6ca124fb61576b274e4188dd38e9/src/OpenCV.cc i przed returnem (linia 66) dodaj:

delete img;

Daj znać czy rozwiązało problem, będzie można zrobić pulla ;p
CzarnyBelzebub
CzarnyBelzebub
@fabek: Spróbuj zrobić cv.readimage bezpośrednio do bufora i tak jak mówi @obereczekpl dawaj null do tych danych na końcu każego obiegu pętli.
DiKey
@fabek: ale dodaj do wklejki importy albo powiedz co się kryje za zmienną cv
fabek
fabek Autor
0
@DiKey: oczywiście

var cv = require('opencv');
wydaje się to oczywiste w detekcji obiektów
Jurigag
@fabek: valgrind ?
fabek
fabek Autor
0
@Jurigag: hmm dobry pomysł, zaraz wypróbuje. ciekawe czy będzie działać na ARM-ie.
Jurigag
@fabek: nie mam pojęcia :D w sumie możesz spróbować najpierw to co @DiKey: bo moje rozwiązanie to w sumie dosyć złożona sprawa
fabek
fabek Autor
0
@Jurigag: niestety nie ogarnia openv pod arm.
Jurigag
@fabek: to z ciekawości sprawdź najpierw ten kod pod x86 ?
fabek
fabek Autor
0
@DiKey: na pewno wypróbuje, dobry pomysł! to chyba bedę musiał przekompilować opencv całe?
larvaexotech
larvaexotech
@fabek: proponuje zrzucić snapshot i obadać go w chromie:

https://github.com/bnoordhuis/node-heapdump
fabek
fabek Autor
0
@larvaexotech: juz to robilem i moge wkleic te dumpy, ale nic z tego za bardzo nie wynika, doszedłem ze readImage zjada ram jak szalone.
o.....l
o.....l
@fabek @DiKey : w Node.js i ogólnie w JS nie zwalniasz ręcznie pamięci - ani przez samodzielne przywołanie GC, ani przez "delete". GC jeśli przyjdzie to usunie wszystkie obiekty, które nie mają referencji do jakiegokolwiek innego obiektu.

W tym wypadku na oko ciężko stwierdzić co powoduje wyciek pamięci, jednak, skoro korzystasz z Node.js, to zacznij od:

- zmiany for na forEach
- dodaj let keyword
fabek
fabek Autor
0
@obereczekpl: @CzarnyBelzebub: jutro wypróbuje koledzy i dam znać. nie daje mi to spokoju, ta funkcja uruchomiona jest w setInterval() i juz po parunastu minutach brakuje pamięci na BPi.
fabek
fabek Autor
0
@obereczekpl: for / foreach nic nie zmienia, let zamiast var nodejs nie rozpoznaje, im=null nie moge wykonać.
o.....l
o.....l
@fabek node -v? Co to znaczy, że im = null nie możesz wykonać?
fabek
fabek Autor
0
@obereczekpl: v0.10.29

/root/demo/index.js:75
im.save(path + '_' + filename);
^
TypeError: Cannot call method 'save' of null
at /root/demo/index.js:75:12
o.....l
o.....l
Gdzie dokładnie wstawiasz im = null? Wygląda na to, że "nullujesz" to zanim odpalisz im.save. Powinno się to dziać w callbacku, po wspomnianym im.save, które wygląda na synchroniczne bo nie przyjmuje callbacka.

Ponadto 0.10.x to stara wersja z czasów, gdy dinozaury biegały po naszych ulicach ( ͡° ͜ʖ ͡°)
Na Malinie jesteś w stanie zainstalować gałąź 4.x, która jest dramatycznie szybsza niż <=0.12.