fast path for mongodb batches (otherwise it's O(n^2) memory, which gets ugly fast)

v1.18.x
Ben Lubar 9 years ago
parent fb4f1e1315
commit df8c1abf7d

@ -23,6 +23,11 @@ var async = require('async'),
return callback(new Error('[[error:process-not-a-function]]'));
}
// use the fast path if possible
if (db.processSortedSet && typeof options.doneIf !== 'function' && !utils.isNumber(options.alwaysStartAt)) {
return db.processSortedSet(setKey, process, options.batch || DEFAULT_BATCH_SIZE, callback);
}
// custom done condition
options.doneIf = typeof options.doneIf === 'function' ? options.doneIf : function(){};
@ -58,4 +63,4 @@ var async = require('async'),
);
};
}(exports));
}(exports));

@ -533,4 +533,40 @@ module.exports = function(db, module) {
callback(err, data);
});
};
};
module.processSortedSet = function(setKey, process, batch, callback) {
var done = false, ids = [], cursor = db.collection('objects').
find({_key: setKey}).
sort({score: 1}).
project({_id: 0, value: 1}).
batchSize(batch);
async.whilst(
function() {
return !done;
},
function(next) {
cursor.next(function(err, item) {
if (err) {
return next(err);
}
if (item === null) {
done = true;
} else {
ids.push(item.value);
}
if (ids.length < batch && (!done || ids.length === 0)) {
return next(null);
}
process(ids, function(err) {
ids = [];
return next(err);
});
});
},
callback
);
};
};

Loading…
Cancel
Save