2016-03-22 1 views
3

mongoDB(バージョン3.2.4)にGoogle Ngramsからアークを供給しようとしていますが、まともな設定でも時間がかかりすぎています(MBP Mid 2014 、2.2 GHz Intel Core i7、16 GB)MongoDB bulk.execute()は、順不同で挿入するには時間がかかります

元のファイルの8,900,000行ごとに、docbulk.insert(doc);を順不同の一括で作成します。

500個を挿入した後、bulk.execute()を実行し、それらのすべてがDBに追加されるまでこのプロセスを繰り返します。これは決して起こりません。何千ものドキュメントが挿入され、それを待つ時間は8,9k分です。ここ

はコード行く:

MongoClient.connect(url, function (err, db) { 
if (err) { 
    console.log('Unable to connect to the mongoDB server. Error:', err); 
} else { 
    //connected 
    console.log('Connection established to', url); 

    var bulk = db.collection('bigrams').initializeUnorderedBulkOp(); 

    const rl = readline.createInterface({ 
    input: fs.createReadStream(path+filename) 
    }); 

    rl.on('line', function (line) { 
     var stringArray = line.split("\t"); 
     var firstPart = stringArray[0]+'\t'+stringArray[1]+'\t'+stringArray[2]+"\t"; 

     var head_token = stringArray[0]; 
     var syntatic_ngram = stringArray[1].split(" "); 
     var total_count = stringArray[2]; 
     var counts_by_year = line.replace(firstPart,'').split("\t"); 

     var doc = { 
     "head token" : head_token, 
     "syntatic ngram" : syntatic_ngram, 
     "total count" : total_count, 
     "counts by year" : counts_by_year 
     }; 
     count++; 
     bulkCount++; 
     if (bulkCount == bulkSize) { 
     console.log("BulkSize reached. Executing..."); 
     bulk.execute(); 
     bulkCount = 0; 
     } 
     console.log("bulk inserted count:"+count); 
     bulk.insert(doc); 
    }); 

    rl.on('end', function(){ 
     bulk.execute(); 
     db.close(); 
    }); 

    } 
}); 

P.S.:The最初の10k挿入を、すなわち、最初の20 bulk.execute()は< 1メートル本当に速いプロセスです。その後、処理時間が長くなります。 ): 訴訟はありますか?ありがとうございました。

+0

あなたの投稿にMongoDBのバージョン、ハードウェア構成、MongoDBデータベースの種類を言及してください。 – Saleem

+0

上記のコレクションに追加のインデックスを設定していますか? – woozyking

+0

コードは私が取り組んできたすべてのものです。 DBを構築した後、私はインデックスについて作業します。 –

答えて

0

私はmongoDB documentationから答えを得ました: "実行後、再初期化せずにBulk()オブジェクトを再実行することはできません。"

私はちょうどbulk.execute();の後にbulk = db.collection('bigrams').initializeUnorderedBulkOp();を追加しました。挿入時間は一定でした。数分、すべてが挿入されました。

これは他の人に役立つことを願っています。 (:

関連する問題