Promise.map: превышен максимальный размер стека вызовов - PullRequest
0 голосов
/ 02 января 2019

Я использую метод bluebirds Promise.map () для запуска 100 000 запросов firebase, как показано ниже, и выполнение этой функции занимает около 10 секунд. Если установить параллелизм выше 1000, я получу ошибку

Превышен максимальный размер стека вызовов

Любые идеи о том, как это исправить, а также как ускорить это. Мне кажется, что, возможно, Promise.map () может быть неправильной функцией, или, может быть, я каким-то образом неправильно управляю памятью. Любые идеи, спасибо.

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;
            })

редактирует

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;
            })

1 Ответ

0 голосов
/ 02 января 2019

Обновление: Если цель состоит в том, чтобы количество постов в друзьях было лучше, лучше использовать облачную функцию, которая увеличивает счетчик для каждого нового поста, сохраняемого в БД. Таким образом, вы можете получить количество сообщений без необходимости расчета.

Вот аналогичный ответ и пример кода с одинаковым счетчиком

Оригинальный ответ: Вы можете попытаться увеличить объем памяти, выделенной для вашего Cloud Funciton:

  1. В консоли Google Cloud Platform выберите Облачные функции в левом меню.
  2. Выберите функцию, щелкнув ее имя в списке функций.
  3. Щелкните значок «Редактировать» в верхнем меню.
  4. Выберите выделение памяти в раскрывающемся меню с пометкой Память выделена.
  5. Нажмите Сохранить, чтобы обновить функцию.

Как описано в Управление развертыванием функций страница

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...