我有一个函数可以从数据库中获取线程(gmail会话)ID,然后向Google API请求每个线程ID的所有数据。一旦它收到一个线程对象,它将它存储到数据库中。这适用于我的收件箱,其中有1k条消息。但我不确定它是否适用于超过10万条消息的帐户。只要有足够的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))
我不知道是不是因为内存,但我确实记得在SQL中部分实现了MongoDB工具。在测试不同尺寸的零件之前,零件版本的零件速度要快2倍。 – DrakaSAN
@DrakaSAN我完全一样。我有mySQL数据库有数百万行,并且我做了一个CRON,它部分地从SQL迁移到mongo。但那是PHP。我相信这个回调世界可能会更好地工作一次,无论需要多长时间,我只需要它来完成这项工作。 – Kunok
你可以做的是避免'threadContents'并插入'resp'本身。你也在循环内创建'anotherCollection',这是毫无意义的,因为它一次又一次地是同一个对象。那么你肯定会没有任何问题与内存。 – sed