MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Cara untuk menurunkan penggunaan memori oleh luwak saat melakukan kueri

Luwak default .find() tentu saja mengembalikan semua hasil sebagai "array", sehingga akan selalu menggunakan memori dengan hasil yang besar, jadi ini meninggalkan antarmuka "stream".

Masalah dasar di sini adalah Anda menggunakan stream antarmuka ( karena ini mewarisi dari aliran simpul dasar ) setiap peristiwa data "diaktifkan" dan pengendali peristiwa terkait dijalankan secara terus-menerus.

Ini berarti bahwa bahkan dengan "aliran", tindakan Anda selanjutnya di pengendali peristiwa "bertumpuk", setidaknya menghabiskan banyak memori dan mungkin menghabiskan tumpukan panggilan jika ada proses asinkron lebih lanjut yang diaktifkan di sana.

Jadi hal terbaik yang dapat Anda lakukan adalah mulai "membatasi" tindakan dalam pemrosesan streaming Anda. Ini semudah memanggil .pause() metode:

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
});

Jadi .pause() menghentikan peristiwa dalam aliran yang dipancarkan dan ini memungkinkan tindakan di pengendali peristiwa Anda selesai sebelum melanjutkan sehingga semuanya tidak datang sekaligus.

Ketika kode penanganan Anda selesai, Anda memanggil .resume() , baik secara langsung di dalam blok seperti yang ditunjukkan di sini di dalam blok panggilan balik dari setiap tindakan asinkron yang dilakukan di dalam blok. Perhatikan bahwa aturan yang sama berlaku untuk tindakan asinkron, dan bahwa "semua" harus menandakan penyelesaian sebelum Anda harus memanggil resume.

Ada pengoptimalan lain yang dapat diterapkan juga, dan sebaiknya Anda melihat modul "pemrosesan antrian" atau "kontrol aliran asinkron" yang tersedia untuk membantu Anda mendapatkan lebih banyak kinerja dengan beberapa eksekusi paralel ini.

Tapi pada dasarnya pikirkan .pause() lalu proses dan .resume() untuk terus menghindari memakan banyak memori dalam pemrosesan Anda.

Juga, waspadai "keluaran" Anda dan coba gunakan "aliran" lagi jika membangun sesuatu untuk tanggapan. Semua ini akan sia-sia jika pekerjaan yang Anda lakukan sebenarnya hanya membangun variabel lain dalam memori, jadi akan membantu untuk menyadarinya.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Skema model luwak dengan larik referensi:CastError:Cast to ObjectId gagal untuk nilai [object Object]

  2. Versi MongoDB apa yang diinstal di Ubuntu?

  3. Batas geolokasi Mongodb pencarian/permintaan

  4. memetik vs berbeda di mongoid db. mana yang lebih cepat?

  5. MongoDB dengan C# - kueri dengan predikat yang dihasilkan secara dinamis