Domyślna mangusta .find()
oczywiście zwraca wszystkie wyniki jako „tablicę”, więc zawsze będzie to używać pamięci z dużymi wynikami, więc pozostawia interfejs „strumienia”.
Podstawowym problemem jest to, że używasz strumienia interfejs (ponieważ ten dziedziczy z podstawowego strumienia węzłów) każde zdarzenie danych "odpala" i skojarzony program obsługi zdarzeń jest wykonywany w sposób ciągły.
Oznacza to, że nawet przy „strumieniu” kolejne akcje w module obsługi zdarzeń „kumulują się”, co najmniej zużywają dużo pamięci i prawdopodobnie pochłaniają stos wywołań, jeśli są tam uruchamiane dalsze procesy asynchroniczne.
Więc najlepszą rzeczą, jaką możesz zrobić, to zacząć „ograniczać” działania w przetwarzaniu strumienia. Jest to tak proste, jak wywołanie .pause()
metoda:
var stream = model.find().stream(); // however you call
stream.on("data",function() {
// call pause on entry
stream.pause();
// do processing
stream.resume(); // then resume when done
});
Więc .pause()
zatrzymuje emitowanie zdarzeń w strumieniu, co pozwala na zakończenie działań w module obsługi zdarzeń przed kontynuowaniem, tak aby nie wszystkie pojawiały się jednocześnie.
Gdy Twój kod obsługi jest gotowy, wywołujesz .resume()
, bezpośrednio w bloku, jak pokazano tutaj, w bloku wywołania zwrotnego dowolnej akcji asynchronicznej wykonywanej w bloku. Pamiętaj, że te same zasady dotyczą działań asynchronicznych i że „all” musi sygnalizować zakończenie, zanim wywołasz wznowienie.
Istnieją również inne optymalizacje, które można zastosować, i dobrze byłoby poszukać dostępnych modułów „przetwarzania kolejki” lub „asynchronicznej kontroli przepływu”, aby pomóc w uzyskaniu większej wydajności przy pewnym równoległym wykonywaniu tego.
Ale po prostu pomyśl .pause()
następnie przetwórz i .resume()
aby nadal unikać pochłaniania dużej ilości pamięci podczas przetwarzania.
Należy również być świadomym swoich „wyników” i podobnie spróbować ponownie użyć „strumienia”, jeśli tworzymy coś do odpowiedzi. Wszystko to będzie na nic, jeśli praca, którą wykonujesz, polega na budowaniu kolejnej zmiennej w pamięci, więc warto być tego świadomym.