Wpis z mikrobloga

#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
  • 25
@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 przed car
- usuń wszelkie referencje do
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.