MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Sposób na zmniejszenie zużycia pamięci przez mangusty podczas wykonywania zapytania

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak używać Spring do łączenia się z MongoDB, która wymaga uwierzytelnienia?

  2. Niestandardowa metoda aktualizacji zapytania z danymi wiosennymi MongoRepository

  3. Jaka jest różnica między Spring Data MongoDB a Hibernate OGM dla MongoDB?

  4. Budowanie indeksów w MongoDB za pomocą sterownika .NET 2.0

  5. Jak zaprojektować schemat dla poniższego produktu za pomocą mangusty?