【问题标题】:True Memory Issue - Cloud Functions [closed]真正的内存问题 - 云函数 [关闭]
【发布时间】:2020-10-25 18:30:25
【问题描述】:

基本上尝试做一些日常用户管理工作。用户数据库有几千个用户(30 人左右),但由于大小,功能看起来很困难。

我尽可能地简化了函数,是的,我增加了大小和内存限制(540 秒,2 GB)。

也许我做错了什么愚蠢的错误,也许我需要探索不同的解决方案,例如 Cloud Run 或 App Engine 或更大的解决方案。


module.exports = async (data, context)  => {

  // Get all of the users in the database
  const userQuery = await db.collection('users').get()

  let authPromises = []

  userQuery.forEach(userDoc => {
    
    authPromises.push(
      admin.auth().getUser(userDoc.id).then(userResult => {
        return {
          metadata: userResult.metadata,
          ...userDoc.data().arrayOfKeysIWant
        }
      })
    )    

  })

  let authResult = await Promise.all(authPromises)

  let signInCount = 0
  authResult.forEach(user => {
    if (user.metadata.lastRefreshTime) {
      signInCount += 1
    }
  })

  console.log(signInCount)

  return new Promise((res, rej) => {
    res({count: authResult.length, signInCount})
  })

}

【问题讨论】:

  • 如果您真的需要遍历数据库中的每个用户,也许您可​​以使用a cursor 分块执行此操作?
  • 当然,我会试试看

标签: javascript node.js firebase google-cloud-firestore google-cloud-functions


【解决方案1】:

查询所有这些文档并同时将它们全部加载到内存中绝对不能扩展。如果您要单独处理任意大的文档集合,您应该使用pagination 将您的查询分成多个批次。考虑到文档的内容,您应该做一些数学计算,找出适合可用内存的合适页面大小。

【讨论】:

  • 感谢道格和@cbr。我将尝试使用分页/光标。我只是在客户端演示上下文中想到过这一点。
  • 因此批处理解决了内存问题,但是由于需要进行各种 API 调用,我现在正在超时使用该功能。还有其他想法/策略吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
相关资源
最近更新 更多