【问题标题】:How to bulk update to realtime database faster with admin sdk?如何使用 admin sdk 更快地批量更新实时数据库?
【发布时间】:2019-07-14 22:13:17
【问题描述】:

我需要定期将一组数据更新到我的实时数据库中(大约 1100-1200 个数据),这些数据可能存在也可能不存在于数据库中。

我已将 python 和 java admin sdk 用于 firebase。首先,我尝试使用循环更新数据,但它似乎非常慢,因为更新 1100 个数据需要 40 多分钟。我无法批量更新,因为它会覆盖我现有的数据。我需要一种方法来更新每个节点内的数据,如果数据不存在,那么只需创建一个新节点。

我一直这样做,但这需要永远

for data in datalist:
    if data.id and data.uid:
        obj = {
            'name': data.name,
            'id': data.id
        }

        grd = {}
        grd['basic'] = data.gender
        ref = root.child(data.uid).update(obj)
        ref = root.child(data.uid).child('basic').update(grd)

我认为我可以从实时数据库中下载我的整个数据库并对其进行修改。然后我可以更新整个数据。但目前我的数据库大小约为 4 mb,增长速度非常快。因此,即使我这样做,将来也会越来越难。

这种批量更新还有其他方法吗?或者有什么办法可以将更新时间缩短到 5~10 分钟?

【问题讨论】:

    标签: java python firebase-realtime-database


    【解决方案1】:

    我能想到的唯一方法是使用多位置更新,如here 所示。在那里,您正在创建指向要更新的确切属性的深层路径,因此您可以将粒度更新应用于数据库中的任何内容。在 JavaScript 语法中,您当前作为多位置更新写入的内容如下所示:

    root.update({
      `/${data.uid}/name`: data.name,
      `/${data.uid}/id`: data.id,
      `/${data.uid}/basic/basic`: data.gender
    })
    

    使用这种方法将减少网络开销,因为您将多个调用合并为一个。另一方面,处理更新可能需要更多时间在服务器上,因为它需要在将所有更新提交到磁盘之前将所有更新保存在内存中。因此,您需要衡量使用多位置更新对性能的影响。

    我建议将 100 次更新合并到一次调用中,然后测量该调用与 100 次单独调用之间的性能差异。

    【讨论】:

    • 非常感谢您的建议,很抱歉回复晚了。我尝试了这个解决方案,它使上传速度非常快(2500 个数据更新大约需要 7 秒)。但它会覆盖我现有的数据而不是更新它。有什么我做错了吗?我遵循了该链接上提供的 java 解决方案。
    • 我在回答中显示的内容应该更新传递给 update 的特定路径,除此之外没有任何内容。如果这不是你正在发生的事情,那么你确实可能做错了什么。如果没有看到您使用的代码,我不可能说出那是什么。
    • 显然我发现我做错了什么,我正在更新一个特定节点的值,该节点正在用该数据覆盖整个节点。但我认为这个解决方案是最好的一些修改。非常感谢:D
    猜你喜欢
    • 1970-01-01
    • 2021-04-04
    • 2022-01-07
    • 1970-01-01
    • 2012-12-06
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    相关资源
    最近更新 更多