Im using bluebirds Promise.map() method to run 100,000 firebase queries as shown below and the function takes about 10 seconds to run.. If I set the concurrency higher than 1000 then I receive the error
Maximum call stack size exceeded
Any ideas on how to fix this and also how to speed this up. It seems to me that perhaps Promise.map() may not be the right function to use or maybe I am mismanaging the memory some how. Any ideas thank you.
exports.postMadeByFriend = functions.https.onCall(async (data, context) => {
const mainUserID = "hJwyTHpoxuMmcJvyR6ULbiVkqzH3";
const follwerID = "Rr3ePJc41CTytOB18puGl4LRN1R2"
const otherUserID = "q2f7RFwZFoMRjsvxx8k5ryNY3Pk2"
var refs = [];
for (var x = 0; x < 100000; x += 1) {
if (x === 999) {
const ref = admin.database().ref(`Followers`).child(mainUserID).child(follwerID)
refs.push(ref);
continue;
}
const ref = admin.database().ref(`Followers`).child(mainUserID).child(otherUserID);
refs.push(ref);
}
await Promise.map(refs, (ref) => {
return ref.once('value')
}, {
concurrency: 10000
}).then((val) => {
console.log("Something happened: " + JSON.stringify(val));
return val;
}).catch((error) => {
console.log("an error occured: " + error);
return error;
})
Edits
const runtimeOpts = {
timeoutSeconds: 300,
memory: '2GB'
}
exports.postMadeByFriend = functions.runWith(runtimeOpts).https.onCall(async (data, context) => {
const mainUserID = "hJwyTHpoxuMmcJvyR6ULbiVkqzH3";
const follwerID = "Rr3ePJc41CTytOB18puGl4LRN1R2"
const otherUserID = "q2f7RFwZFoMRjsvxx8k5ryNY3Pk2"
var refs = [];
for (var x = 0; x < 100000; x += 1) {
if (x === 999) {
const ref = admin.database().ref(`Followers`).child(mainUserID).child(follwerID)
refs.push(ref);
continue;
}
const ref = admin.database().ref(`Followers`).child(mainUserID).child(otherUserID);
refs.push(ref);
}
await Promise.map(refs, (ref) => {
return ref.once('value')
}, {
concurrency: 10000
}).then((val) => {
console.log("Something happened: " + JSON.stringify(val));
return val;
}).catch((error) => {
console.log("an error occured: " + error);
return error;
})