私は、データベースからスレッド(Gmailの会話)IDを取り出し、各スレッドIDのすべてのデータをGoogle APIに問い合わせる機能を持っています。スレッドオブジェクトを受信すると、スレッドオブジェクトはデータベースに格納されます。これは、〜1kのメッセージを持つ受信トレイでうまく動作します。しかし、100kを超えるメッセージを持つアカウントではうまくいくかどうかはわかりません。膨大なコールバックがスクリプトを中断するか、十分なRAMが利用可能になるたびに続行しますか?
マシンがメモリ不足になったら、十分なRAMが再び利用可能になるたびにコールバック関数を実行し続けますか?私は(いくつかの点で再実行スクリプト全体を、それが最後に終了した場所から新鮮なRAMを続行?)このパートごとの一部を行うには、このコードを変更する必要があり
function eachThread(auth) {
var gmail = google.gmail('v1');
MongoClient.connect(mongoUrl, function(err, db){
assert.equal(null, err);
var collection = db.collection('threads');
// Find all data in collection and convert it to array
collection.find().toArray(function(err, docs){
assert.equal(null, err);
var threadContents = [];
// For each doc in array...
for (var i = 0; i < docs.length; i++) {
gmail
.users
.threads
.get({auth:auth,'userId':'me', 'id':docs[i].id}, function(err, resp){
assert.equal(null, err);
threadContents.push(resp);
console.log(threadContents.length);
console.log(threadContents[threadContents.length - 1].id);
var anotherCollection = db.collection('threadContents');
anotherCollection.updateOne(
{id: threadContents[threadContents.length - 1].id},
threadContents[threadContents.length - 1],
{upsert:true},
function(err, result){
assert.equal(null, err);
console.log('updated one.');
});
if (threadContents.length === docs.length) {
console.log('Length matches!');
db.close();
}
});//end(callback(threads.get))
}//end(for(docs.length))
});//end(find.toArray)
});//end(callback(mongo.connect))
}//end(func(eachThread))
RAMであるかどうかわかりませんが、SQL to MongoDBツールで部分的に実装しています。パーツ・バイ・パーツ・バージョンは、異なるサイズのパーツをテストする前に* 2速くなっていました。 – DrakaSAN
@DrakaSAN私はまったく同じでした。私は何百万もの行を持つmySQLデータベースを持っていました。そして、SQLからmongoへの部分的な移行に参加したCRONを作ったのです。しかしそれはPHPでした。私は、このコールバックの世界は、それがどれくらい時間がかかっても、一回の実行としてうまくいくかもしれないと信じています。 – Kunok
あなたができることは 'threadContents'を避けて' resp'自身を挿入することです。ループ内に 'anotherCollection'を作成していて、同じオブジェクトが何度も繰り返されるため意味がありません。それでラムには何の問題もないでしょう。 – sed