问题描述
我正在 Android 中开发 Kotlin 应用。我正在使用 Kotlin 的 ObjectBox 接口来存储多达 4000 万个数据点对象。我想从数据库上传和删除它们。我通过检索 100000 个对象的列表并上传它们,然后一次将它们从 db 一个列表中删除来做到这一点。 使用快速网络连接会产生问题,即上传作业的速度比垃圾收集器从 ram 中清除已经上传的对象的速度要快。 我通过查看以下日志获得了此信息,该日志每秒出现一次以上。
2021-01-13 16:58:04.280 27936-27951/project I/e.project:后台年轻并发复制 GC 释放 175472(7966KB) AllocSpace 对象,10(1292KB) LOS 对象,25%/免费,23MB 31MB,暂停 1.295ms 总共 169.984ms
我的理解是,我在内存中查询和创建数十万个对象,只上传一次然后丢弃它们是非常低效的。但我还没有找到更好的解决方案。
我的想法是:
-
每次迭代重复使用相同的 100.000 个对象。因此,只有一个数据对象列表,并在上传它们后将数据库中接下来的 100.000 个条目的数据填充到已经存在的对象中。这样,在上传所有数据之前,GC 就不必清除它们。 这将需要一种将查询结果保存到现有对象/对象列表中的方法。我在 ObjectBox 文档中找不到这个。
-
从数据库中以某种流的形式读取数据,并且在上传过程中根本不将它们表示为对象。我也无法在 ObjectBox 中找到此功能。
您知道支持这些方法之一的 ObjectBox 功能吗? 你知道解决这个问题的不同方法吗?
我目前使用
查询数据return sensorDataBox.query { }.find(offset = 0,limit = 100000)
以前我依赖
sensorDataBox.query { }.findLazy()
但是盒子里有 4000 万个以上的对象,即使是惰性列表也太大了,无法一次检索所有对象。并且没有用于查询惰性列表的限制参数。所以我不得不恢复到 .find(offset,limit)。
如果您需要我提供更多信息,请索取!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)