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

Apakah mungkin untuk meningkatkan kecepatan Mongoexport?

Ada banyak faktor yang membatasi kinerja ekspor.

  • Ukuran data relatif besar dibandingkan dengan memori yang tersedia:~2 TB vs. ~5 GB cache WiredTiger (jika disetel ke default). Yaitu:
    • Seluruh cache WiredTiger hanya dapat berisi paling baik ~0,22% dari koleksi, pada kenyataannya sangat mungkin jauh lebih kecil dari ini karena cache akan berisi data dari koleksi dan indeks lain.
    • Ini berarti bahwa WiredTiger harus sering mengambil dari disk, sambil mengeluarkan konten cache saat ini. Jika kumpulan replika sedang digunakan secara aktif, ini berarti mengeluarkan data "kotor" dari cache dan menyimpannya ke disk, yang akan memakan waktu.
    • Perhatikan bahwa dokumen di dalam cache WiredTiger tidak dikompresi.
  • Koleksi berisi dokumen besar, yang Anda hanya memerlukan satu bagian saja. Artinya, diperlukan waktu ekstra untuk memproses dokumen.
  • Koleksi dikompresi dengan zlib, artinya waktu ekstra harus digunakan untuk membuka kompresi dokumen.
  • ReadPreference adalah secondaryPreferred , yang berarti bahwa ia akan mencoba membaca dari sekunder. Jika kumpulan replika sedang ditulis secara aktif, operasi penerapan oplog pada sekunder akan memblokir pembaca. Ini akan menambah penundaan lebih lanjut.

Salah satu peningkatan yang mungkin adalah jika ini adalah operasi yang sering Anda lakukan, membuat indeks pada bidang yang relevan dan mengekspornya menggunakan kueri tercakup dapat meningkatkan kinerja karena indeks akan lebih kecil daripada dokumen lengkap.

Edit:Menjalankan mongoexport secara paralel dapat membantu dalam kasus ini:

Lebih jauh dari informasi tambahan yang diberikan, saya menjalankan tes yang tampaknya sedikit meringankan masalah ini.

Tampaknya menjalankan mongoexport secara paralel, di mana setiap mongoexport menangani subset koleksi mungkin dapat mempercepat ekspor.

Untuk melakukannya, bagi _id namespace sesuai dengan jumlah mongoexport proses yang Anda rencanakan untuk dijalankan.

Misalnya, jika saya memiliki 200.000 dokumen, dimulai dengan _id:0 ke _id:199,999 dan menggunakan 2 mongoexport proses:

mongoexport -q '{"_id":{"$gte":0, "$lt":100000}}' -d test -c test > out1.json &
mongoexport -q '{"_id":{"$gte":100000, "$lt":200000}}' -d test -c test > out2.json &

dimana pada contoh di atas, dua mongoexport proses masing-masing menangani setengah dari koleksi.

Menguji alur kerja ini dengan 1 proses, 2 proses, 4 proses, dan 8 proses Saya sampai pada waktu berikut:

Menggunakan 1 proses:

real    0m32.720s
user    0m33.900s
sys 0m0.540s

2 proses:

real    0m16.528s
user    0m17.068s
sys 0m0.300s

4 proses:

real    0m8.441s
user    0m8.644s
sys 0m0.140s

8 proses:

real    0m5.069s
user    0m4.520s
sys 0m0.364s

Bergantung pada sumber daya yang tersedia, menjalankan 8 mongoexport proses secara paralel tampaknya mempercepat proses dengan faktor ~6. Ini telah diuji dalam mesin dengan 8 inti.

Catatan :jawaban halfer serupa dalam ide, meskipun jawaban ini pada dasarnya mencoba untuk melihat apakah ada manfaat dalam memanggil mongoexport secara paralel.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Perbarui Subdocument di Mongodb yang menyimpan id

  2. Transaksi Di MongoDB

  3. Modul tidak ditemukan:Kesalahan:Tidak dapat menyelesaikan 'dns' saat menggunakan MongoDB

  4. Tidak diizinkan untuk kueri di admin.system.namespaces di mongodb

  5. Menggunakan findOne dalam satu lingkaran membutuhkan waktu terlalu lama di Node.js