cari

Rumah  >  Soal Jawab  >  teks badan

nosql - MongoDB的MR问题!

听说mongodb的MapReduce是单线程的,性能很差,这是怎么回事?差到什么程度呢??有哪位大侠能说说原理。

怪我咯怪我咯2800 hari yang lalu805

membalas semua(3)saya akan balas

  • PHP中文网

    PHP中文网2017-04-21 11:18:15

    Saya tidak tahu sama ada pelaksanaan di dalam adalah satu-benang, tetapi jika ia adalah persekitaran pengeluaran, adalah lebih baik untuk tidak mengakses terus hasil mapReduce setiap kali Bergantung pada saiz data, ia masih akan mengambil masa jangka masa tertentu. Data kami berjumlah berpuluh-puluh juta, dan setiap pelaksanaan mapReduce mengambil masa kira-kira 5-6 saat Mujurlah, aplikasi kami bukan masa nyata. Jadi pada asasnya data dicache selama 2 jam, dan kemudian mapReduce dilaksanakan untuk mendapatkan hasil terkini.

    balas
    0
  • ringa_lee

    ringa_lee2017-04-21 11:18:15

    Saya rasa artikel ini akan menerangkan isu prestasi mongodb!
    http://stackoverflow.com/questions/39...

    balas
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-21 11:18:15

    Saya telah melakukan perkara yang sama sebelum menggunakan MapReduce Kerana ia memakan masa, saya kemudiannya mengubah suai untuk menggunakan pertanyaan agregat untuk statistik adalah seperti berikut:

    > db.user.findOne()
    {
        "_id" : ObjectId("557a53e1e4b020633455b898"),
        "accountId" : "55546fc8e4b0d8376000b858",
        "tags" : [
            "金牌会员",
            "钻石会员",
            "铂金会员",
            "高级会员"
        ]
    }

    Model dokumen asas adalah seperti di atas, saya mengindeks pada accountId dan teg

    db.user.ensureIndex({"accountId":1, "tags":1})

    Kini ia dikehendaki mengira teg di bawah pengguna direka bentuk seperti berikut:

    var mapFunction = function() {
       if(this.tags){
           for (var idx = 0; idx < this.tags.length; idx++) {
               var tag = this.tags[idx];
               emit(tag, 1);
           }
       }
    };
    
    var reduceFunction = function(key, values) {
        var cnt=0;   
        values.forEach(function(val){ cnt+=val;});  
        return cnt;
    };
    
    
    db.user.mapReduce(mapFunction,reduceFunction,{out:"mr1"})    //输出到集合mr1中

    Keputusan:

    > db.mr1.find().pretty()
    { "_id" : "金牌会员", "value" : 9000 }
    { "_id" : "钻石会员", "value" : 43000 }
    { "_id" : "铂金会员", "value" : 90000 }
    { "_id" : "铜牌会员", "value" : 3000 }
    { "_id" : "银牌会员", "value" : 5000 }
    { "_id" : "高级会员", "value" : 50000 }

    Nampaknya telah mencapai kesan kami. Saya hanya menggunakan sedikit data 10W untuk melakukan ujian di atas semasa proses pelaksanaan, ia akan mengeluarkan:

    > db.mapReduceTest.mapReduce(mapFunction,reduceFunction,{out:"mr1"})
    {
        "result" : "mr1",
        "timeMillis" : 815,                   //耗时多久
        "counts" : {
            "input" : 110000,             //扫描的文档数量
            "emit" : 200000,              //mongo执行计算的次数
            "reduce" : 2001,
            "output" : 6
        },
        "ok" : 1
    }

    Oleh kerana data olok-olok saya agak mudah dan teratur, dapat dilihat bahawa bilangan pengiraan adalah hampir dua kali ganda daripada jumlah dokumen yang diimbas Kemudian, saya menggunakan data rawak untuk ujian dan mendapati keputusannya lebih teruk. Saya dengan tegas melepaskan pelaksanaan MapReduce dan menukar Gunakan pelaksanaan lain.

    balas
    0
  • Batalbalas