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

Node menyisipkan data besar menggunakan luwak

Masalahnya di sini adalah bahwa loop yang Anda jalankan tidak menunggu setiap operasi selesai. Jadi sebenarnya Anda hanya mengantri 1000 .save() permintaan dan mencoba menjalankannya secara bersamaan. Anda tidak dapat melakukannya dalam batasan yang wajar, sehingga Anda mendapatkan respons kesalahan.

async module memiliki berbagai metode untuk iterasi saat memproses panggilan balik untuk iterator itu, di mana mungkin direct for yang paling sederhana adalah sementara . Mongoose juga menangani manajemen koneksi untuk Anda tanpa perlu menyematkan dalam callback, karena modelnya sadar akan koneksi:

var tempColSchema = new Schema({
    cid: {
        type: Number,
        required: true
    },
    loc:[]
});

var TempCol = mongoose.model( "TempCol", tempColSchema );

mongoose.connect( 'mongodb://localhost/mean-dev' );

var i = 0;
async.whilst(
    function() { return i < 10000000; },
    function(callback) {
        i++;
        var c = i;
        console.log(c);
        var lon = parseInt(c/100000);
        var lat = c%100000;
        new Tempcol({cid: Math.random(), loc: [lon, lat]}).save(function(err){
            callback(err);
        });            
    },
    function(err) {
       // When the loop is complete or on error
    }
);

Bukan cara yang paling fantastis untuk melakukannya, ini masih menulis satu per satu dan Anda dapat menggunakan metode lain untuk "mengatur" operasi bersamaan, tetapi setidaknya ini tidak akan meledakkan tumpukan panggilan.

Formulir MongoDB 2.6 dan yang lebih baru, Anda dapat menggunakan API Operasi Massal untuk memproses lebih dari satu penulisan pada satu waktu di server. Jadi prosesnya serupa, tetapi kali ini Anda dapat mengirim 1000 sekaligus ke server dalam satu penulisan dan respons, yang jauh lebih cepat:

var tempColSchema = new Schema({
    cid: {
        type: Number,
        required: true
    },
    loc:[]
});

var TempCol = mongoose.model( "TempCol", tempColSchema );

mongoose.connect( 'mongodb://localhost/mean-dev' );

mongoose.on("open",function(err,conn) {

    var i = 0;
    var bulk = TempCol.collection.initializeOrderedBulkOp();

    async.whilst(
      function() { return i < 10000000; },
      function(callback) {
        i++;
        var c = i;
        console.log(c);
        var lon = parseInt(c/100000);
        var lat = c%100000;

        bulk.insert({ "cid": Math.random(), "loc": [ lon, lat ] });

        if ( i % 1000 == 0 ) {
            bulk.execute(function(err,result) {
                bulk = TempCol.collection.initializeOrderedBulkOp();
                callback(err);
            });
        } else {
            process.nextTick(callback);
        }
      },
      function(err) {
        // When the loop is complete or on error

        // If you had a number not plainly divisible by 1000
        if ( i % 1000 != 0 )
            bulk.execute(function(err,result) {
                // possibly check for errors here
            });
      }
    );

});

Itu sebenarnya menggunakan metode driver asli yang belum diekspos di luwak, jadi perawatan tambahan diambil untuk memastikan koneksi tersedia. Itu adalah contoh tetapi bukan satu-satunya cara, tetapi poin utamanya adalah "keajaiban" luwak karena koneksi tidak dibangun di sini jadi Anda harus yakin itu sudah ada.

Anda memiliki sejumlah item untuk diproses, tetapi jika tidak demikian, Anda harus memanggil bulk.execute() di blok terakhir seperti yang ditunjukkan, tetapi itu tergantung pada nomor yang merespons modulo.

Poin utamanya adalah untuk tidak menumbuhkan tumpukan operasi ke ukuran yang tidak masuk akal, dan menjaga pemrosesan tetap terbatas. Kontrol aliran di sini memungkinkan operasi yang membutuhkan waktu untuk benar-benar selesai sebelum melanjutkan ke iterasi berikutnya. Jadi pembaruan batch atau beberapa antrian paralel tambahan adalah yang Anda inginkan untuk kinerja terbaik.

Ada juga .initializeUnorderedBulkOp() formulir untuk ini jika Anda tidak ingin kesalahan penulisan menjadi fatal tetapi tangani kesalahan tersebut dengan cara yang berbeda. Sebagian besar lihat dokumentasi resmi tentang API Massal dan tanggapan tentang cara menafsirkan tanggapan yang diberikan.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB - Cara menemukan nilai yang berbeda berdasarkan string parsial

  2. Menyimpan dan mengambil objek JavaScript di/dari MongoDB

  3. MongoError:pengguna tidak diizinkan untuk melakukan tindakan

  4. Dapatkan dokumen dengan objek bersarang yang cocok dengan kondisi jumlah

  5. Indeks subdokumen dalam mongo