Firebase Android 离线性能

2023-11-27

当单个节点下存储大约 5000 个子节点时,在使用离线功能时初始化 firebase 会变得非常慢。执行第一个查询大约需要 30 秒。初始化后,执行后续查询(例如列出前 25 个子节点)只需不到一秒的时间。

我正在利用以下属性来启用离线功能: Firebase.getDefaultConfig().setPersistenceEnabled(true); firebase.keepSynced(true);

我的结构如下所示:

<root>
 |-my-app-name
   |-<uid>
     |-node
       |-sub node 1
       |-...
       |-sub node 5000

保持同步已设置<uid>节点。子节点显示在回收器视图中。最好,我想列出所有内容(而不是每页 25 个),但我知道这是不可能的,因为没有类似游标的机制(如 Android 为 SQLite 提供的)可用于与 Firebase 一起使用。

这是设计使然吗?我是否需要修改我的数据结构?或者我可以通过其他方式减少初始化时间吗?

我在下面提供了一些日志记录。正如您所看到的,正在进行大量垃圾收集。 Firebase 在初始化时会评估整个数据库吗?

谢谢! 尼尔斯

04-01 15:59:12.029 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 43005(1717KB) AllocSpace objects, 0(0B) LOS objects, 4% free, 31MB/32MB, paused 5.674ms total 57.402ms
04-01 15:59:13.415 2222-2240/abcdef W/art: Suspending all threads took: 6.600ms
04-01 15:59:13.424 2222-2245/abcdef W/art: Suspending all threads took: 9.339ms
04-01 15:59:13.433 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 7097(281KB) AllocSpace objects, 0(0B) LOS objects, 0% free, 32MB/32MB, paused 11.175ms total 27.105ms
04-01 15:59:13.821 2222-2245/abcdef I/art: Background partial concurrent mark sweep GC freed 101674(5MB) AllocSpace objects, 18(530KB) LOS objects, 35% free, 28MB/44MB, paused 3.400ms total 152.664ms
04-01 15:59:15.107 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 394024(15MB) AllocSpace objects, 0(0B) LOS objects, 20% free, 30MB/38MB, paused 1.865ms total 152.182ms
04-01 15:59:15.817 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 218328(8MB) AllocSpace objects, 0(0B) LOS objects, 19% free, 31MB/38MB, paused 1.711ms total 112.325ms
04-01 15:59:16.451 2222-2240/abcdef W/art: Suspending all threads took: 27.786ms
04-01 15:59:16.465 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 190591(7MB) AllocSpace objects, 0(0B) LOS objects, 18% free, 31MB/38MB, paused 1.832ms total 107.416ms
04-01 15:59:16.472 2222-2245/abcdef W/art: Suspending all threads took: 6.823ms
04-01 15:59:17.084 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 178714(6MB) AllocSpace objects, 0(0B) LOS objects, 15% free, 32MB/38MB, paused 1.717ms total 105.529ms
04-01 15:59:17.629 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 163584(6MB) AllocSpace objects, 0(0B) LOS objects, 14% free, 33MB/38MB, paused 1.743ms total 110.764ms
04-01 15:59:18.941 2222-2240/abcdef W/art: Suspending all threads took: 5.078ms
04-01 15:59:19.691 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 95627(3MB) AllocSpace objects, 0(0B) LOS objects, 8% free, 35MB/38MB, paused 7.190ms total 86.171ms
04-01 15:59:19.961 2222-2240/abcdef W/art: Suspending all threads took: 18.208ms
04-01 15:59:20.965 2222-2245/abcdef W/art: Suspending all threads took: 5.254ms
04-01 15:59:20.990 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 55899(2MB) AllocSpace objects, 0(0B) LOS objects, 5% free, 36MB/38MB, paused 6.799ms total 66.923ms
04-01 15:59:22.495 2222-2240/abcdef W/art: Suspending all threads took: 45.180ms
04-01 15:59:22.509 2222-2245/abcdef W/art: Suspending all threads took: 14.254ms
04-01 15:59:22.562 2222-2245/abcdef I/art: Background partial concurrent mark sweep GC freed 198174(6MB) AllocSpace objects, 3(487KB) LOS objects, 32% free, 33MB/49MB, paused 16.949ms total 215.369ms
04-01 15:59:23.811 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 392437(15MB) AllocSpace objects, 0(0B) LOS objects, 18% free, 35MB/43MB, paused 1.936ms total 168.222ms
04-01 15:59:24.480 2222-2240/abcdef W/art: Suspending all threads took: 22.464ms
04-01 15:59:24.497 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 227043(8MB) AllocSpace objects, 0(0B) LOS objects, 18% free, 35MB/43MB, paused 1.723ms total 117.855ms
04-01 15:59:25.173 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 203910(7MB) AllocSpace objects, 0(0B) LOS objects, 16% free, 36MB/43MB, paused 1.694ms total 112.618ms
04-01 15:59:25.181 2222-2245/abcdef W/art: Suspending all threads took: 7.301ms
04-01 15:59:25.784 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 185627(7MB) AllocSpace objects, 0(0B) LOS objects, 14% free, 37MB/43MB, paused 1.719ms total 115.362ms
04-01 15:59:26.345 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 167066(6MB) AllocSpace objects, 0(0B) LOS objects, 13% free, 37MB/43MB, paused 1.651ms total 106.055ms
04-01 15:59:26.865 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 154535(6MB) AllocSpace objects, 0(0B) LOS objects, 11% free, 38MB/43MB, paused 1.644ms total 104.888ms
04-01 15:59:28.357 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 151375(5MB) AllocSpace objects, 33(671KB) LOS objects, 9% free, 39MB/43MB, paused 2.740ms total 104.176ms
04-01 15:59:29.006 2222-2240/abcdef W/art: Suspending all threads took: 19.232ms
04-01 15:59:29.060 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 133554(5MB) AllocSpace objects, 29(580KB) LOS objects, 10% free, 39MB/43MB, paused 1.563ms total 100.220ms
04-01 15:59:30.173 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 131062(4MB) AllocSpace objects, 31(637KB) LOS objects, 9% free, 39MB/43MB, paused 1.653ms total 102.705ms
04-01 15:59:31.245 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 122085(4MB) AllocSpace objects, 26(522KB) LOS objects, 8% free, 39MB/43MB, paused 2.380ms total 100.776ms
04-01 15:59:32.024 2222-2240/abcdef W/art: Suspending all threads took: 20.662ms

PS:这是一个交叉帖子:https://groups.google.com/forum/#!topic/firebase-talk/migEAwv26ns


初始化手段setValue到那个节点吧?因此,在单个节点下初始化 5000 个子节点花费约 30 秒对我来说似乎很不寻常。我在单个节点下处理过几乎相同大小的数据,但性能要好得多。所以我不确定你在单个子节点下放置了多少属性,但无论如何,我想你需要再次检查性能。我认为你正在使用onCompleteListener on setValue计算初始化数据所花费的时间,因为 UI 视图不提供准确的时间,并且通常比实际操作时间慢。

最好是,我想列出全部(而不是每页 25 个),但我 明白这是不可能的,因为没有像这样的游标 可用于使用的机制(如 Android 为 SQLite 提供的那样) 火力基地。

我不太确定你的目的,但对于这些类型的情况我可以建议是维护 Sqlite 和 Firebase 数据库。让我澄清一下。

这个想法是为用户手机中的特定用户维护 Firebase 数据库的相同副本。这样本地数据库就可以在需要时完全满足您的目的。您可以查询数据库并可以使用CursorLoader您对此有丰富的经验。

它还有其他一些优点。您可以使用自己的机制来处理离线同步。当互联网中断时,将您想要同步的数据存储在本地 Sqlite 数据库中,然后当连接建立时,您将在您的BroadcastReceiver。您可以轻松地setValue然后将离线数据传输到 Firebase。 Firebase 当然使这变得更简单,但无论如何,由于您非常关心性能,所以您可以尝试一下。

当您的应用程序执行过多工作时,您发布的 GC 行为很常见。 Firebase 基本上使用WebSocket保持与远程数据库的连接。因此,我认为您需要检查是否与 Firebase 数据库保持不必要的连接。尝试使用removeListener当听众不再被需要时。

Firebase 在初始化时会评估整个数据库吗?

我还不确定你所说的初始化是什么意思,但是是的,如果你再次使用相同的节点setValue对于该节点,它用新的数据集替换以前的数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Firebase Android 离线性能 的相关文章

随机推荐

  • 在引导程序中设置从右到左的单选按钮

    我在用Farsi语言是一种right to left 我在使用此功能时遇到了几个问题Bootstrap version 3 3 6 例如 在单选按钮中 我希望将单选按钮放在关联标签的右侧 div class row container h2
  • 设置环境变量后Elasticsearch报告默认堆内存大小

    为了尝试增加 Windows 机器上 Elasticsearch 的 JVM 堆大小 我定义了以下环境变量 ES HEAP SIZE 6g 机器总共有12G RAM 我已重新启动 ES 并使用 nodes stat HTTP GET 命令查
  • sheet.deleteRows() - 需要从顶部删除所有包含数据的行(最好从第二行开始)

    我需要删除 200 300 行 不包括第 1 行 下面的脚本出现越界错误 而且速度很慢 有人可以帮助提供加快该过程的方法吗 如果可能 排除 ROW 1 function clearRange var sheet SpreadsheetApp
  • 是否可以使用带有额外构建步骤的 Go 构建?

    当 go build 不够并且需要在 go build 的同时运行额外的命令时该怎么办 go tools 是否涵盖了这个用例 如果是这样 约定是什么 我注意到可以传递额外的标志来构建工具 cgo pkg config glib 2 0 go
  • Ajax 无法在 android webview 中工作

    我正在 webview 中加载一个网站 我们在网站中使用了 Ajax 它在网络浏览器和移动浏览器上也工作正常 但在 android webview 中 ajax 不起作用 控制台中没有错误 这是我的代码 public class Activ
  • F#如何扩展泛型数组类型? [复制]

    这个问题在这里已经有答案了 下列的这个问题我想知道如何 或是否 可以扩展通用 F 数组类型 我可以这样做 type System Array with member a Last a GetValue a Length 1 但正如托马斯提到
  • '#' 在 C 中到底做什么? [复制]

    这个问题在这里已经有答案了 我有一个程序 include
  • Automapper - 将多对多关联映射到平面对象的最佳实践

    我有两个实体 Employee and Team 我想要的是一个EmployeeForm具有Name of the Team 我怎样才能实现这个使用自动映射器 我当前的 解决方案 如下 Mapper CreateMap
  • 如果我不知道直到偏移量,我可以从 kafka 主题创建 RDD 吗?

    KafkaUtils createRDD将 offsetRanges 作为参数 我不知道我想读取的主题的直到偏移量 我最多想阅读该主题中的前 30 条消息 我看到有一个KafkaCluster html getLatestLeaderOff
  • 如何在 x86 平台上使用 gcc 声明内存范围不可缓存?

    虽然我已经阅读了有关此的 movntdqa 指令 但已经找到了一种干净的方法来表示不可缓存的内存范围或读取数据 以免污染缓存 我想从海湾合作委员会做到这一点 我的主要目标是交换到大型数组中的随机位置 由于数据恢复很少 希望通过避免缓存来加速
  • 如何在传递给 DataTable Select() 的字符串中包含撇号?

    The dt Select string 给出错误missing operand when apostrophe符号在字符串中 有什么方法可以解决这个错误 或者如何处理这个错误 String value Rubens Home value
  • 参考 ASP.NET Core MVC Web 应用程序 (RC2) 的完整框架库项目?

    我目前正在使用 ASP NET Core MVC RC2 它应该支持从 Core MVC Web 应用程序项目引用完整的框架库项目 但我似乎无法让它发挥作用 我有一个现有的完整框架库项目 我想将其与新的 Core MVC Web 应用程序项
  • Grails 日期验证的最小约束

    我是 grails 和 groovy 的新手 我有一个带有开始和结束日期的项目域类 我想添加一个约束 指定结束日期需要大于开始日期 然后项目的另一个子对象需要使其开始日期和结束日期与父项目的日期进行验证 这是否可以通过 min 约束实现 或
  • 我的 lambda 参数真的会影响我的本地参数吗?

    我正在处理一些 C 代码 它获取一些数据 并将其转发到传入的函数 void foo int data void fun int fun data 以下内容在没有警告的情况下工作 void bar int data int main int
  • 有没有办法用history.js 来判断状态的走向?

    正如标题所说 我希望能够表演出不一样的作品onstatechange事件如果pushState函数被调用 而不是back功能 或者 如果go函数为负函数或正函数 Example if History pushState or History
  • 如何更改Servlet 3.0 Spring MVC分段上传表单的字符编码?

    我有一个非常简单的 JSP Servlet 3 0 Spring MVC 3 1 应用程序 在我的其中一个页面上 我有多种表格 其中一种表单允许用户上传文件 因此配置为enctype multipart form data 我在 web x
  • 罗盘校准objective-c

    我尝试在我的 ios 应用程序中使用指南针 我有一个问题 如果我实施locationManagerShouldDisplayHeadingCalibration方法和return YES 然后校准显示一直显示 但我应该让它像苹果地图一样 I
  • 注释中的通用类型

    考虑以下代码 import java lang annotation Retention import java lang annotation RetentionPolicy public class AnnotationTest Gen
  • Azure 应用程序网关的自定义域

    我正在尝试使用自定义域名创建应用程序网关 但不断收到错误消息 无法指定域名标签 我想知道我是否做错了什么或者天蓝色应用程序网关不可能拥有自定义域名 以下是我在天蓝色应用程序网关方面学到的经验教训 1 Application gateway
  • Firebase Android 离线性能

    当单个节点下存储大约 5000 个子节点时 在使用离线功能时初始化 firebase 会变得非常慢 执行第一个查询大约需要 30 秒 初始化后 执行后续查询 例如列出前 25 个子节点 只需不到一秒的时间 我正在利用以下属性来启用离线功能