Mam aplikację, w której sekwencyjnie pobierane są pliki mp3 z serwera, tymczasowo przechowuję je na moim serwerze, a następnie przesyłam je bezpośrednio do klientów, na przykład:NodeJS: Jak zwolnić bufory przydzielane poza stosem pamięci V8
function downloadNextTrack(){
var request = http.get('http://mp3server.com', function(response){
response.on('data', function(data) {
fs.appendFile('sometrack.mp3', data, function (err) {});
});
response.on('end', function(){
streamTrack('sometrack.mp3');
}
});
};
var clients = []; // client response objects are pushed to this array when they request the stream through a route like /stream.mp3
var stream;
function streamTrack(track){
stream = fs.createReadStream(track);
stream.on('data', function(data){
clients.forEach(function(client) {
client.write(data);
});
});
stream.on('end', function(){
downloadNextTrack(); // redoes the same thing with another track
}
};
Widocznie ten kod jest tworzenie wielu buforów, które nie są uwolnione przez system operacyjny, kiedy uruchomić polecenie „wolny -m”, to co mam (po około 4 godzinach, uruchamiając aplikację):
total used free shared buffers cached
Mem: 750 675 75 0 12 180
-/+ buffers/cache: 481 269
Swap: 255 112 143
Liczba pod "buforami" stale rośnie (jak również cach ed pamięci) i system operacyjny nie odzyskuje tego z powrotem o 180 Mb, aż w końcu moja aplikacja wyczerpuje pamięć i ulega awarii, gdy próbuję utworzyć mały proces, aby zweryfikować bitrate ścieżki, częstotliwość próbkowania, informacje o id3, itp.
Zdiagnozowałem wiele różnych narzędzi (takich jak memwatch i nodetime), aby dowiedzieć się, czy był to wyciek pamięci wewnętrznej, a nie jest, stertę pamięci V8, a także Node RSS różnią się +/- 10mb, ale pozostają stałe przez większość czasu pamięć wolna od systemu OS staje się coraz niższa (kiedy rozpoczyna się proces Node, mam około 350 MB wolnej pamięci).
Przeczytałem gdzieś, że Buforowe instancje przydzielone przez Węzeł mają bezpośredni dostęp do surowej pamięci i dlatego V8 nie ma nad nimi mocy (co sprawdza się z tym, że nie dostaję wycieków pamięci z sterty V8), Rzecz w tym, że potrzebuję sposobu na pozbycie się tych starych buforów. czy to możliwe? Czy będę musiał ponownie uruchomić moją aplikację co 5 godzin (lub, co gorsza, kupić więcej pamięci RAM!)?
PS. Używam Node v0.8.16 na Ubuntu 10.04.
Witam, może to głupie pytanie, ale mnie poprawić jeśli się mylę: kolejność jest 0) pobrać torze # 0 1), gdy wykończenie, strumień dla wszystkich cliends 2) kiedy strumień wykończenie, dwonload Track # 1 Kiedy to robisz, jest to rodzaj rekursji, prawda? w pierwszym wywołaniu 'streamTrack' masz zmienną strumieniową (jest to zmienna globalna?), a na końcu wywołujesz "downloadNextTrack" i ponownie wywołujesz "streamTrack", z inną zmienną strumienia. czy wywołanie za pomocą rekursji może być źródłem problemów? –
W kodzie produkcyjnym ta zmienna strumienia działa bardziej jak singleton, więc gdy rozpoczyna się inny strumień, jest ponownie przypisywany do nowego strumienia ReadStream. Działa jak zmienna globalna, ale nie jest zmienną globalną per se. – pedromtavares
Spróbuj użyć 'setTimeout (function() {streamTrack ('somefile');}, 0);'. To zabije błąd "recursivity" (wiem, trochę opóźniona odpowiedź). –