微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过 ObjectBox db 的数据高效循环内存?

如何解决如何通过 ObjectBox db 的数据高效循环内存?

我正在 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

上传速度在很短的时间内显着减慢,并定期弹出其他内存错误

我的理解是,我在内存中查询和创建数十万个对象,只上传一次然后丢弃它们是非常低效的。但我还没有找到更好的解决方案。

我的想法是:

  1. 每次迭代重复使用相同的 100.000 个对象。因此,只有一个数据对象列表,并在上传它们后将数据库中接下来的 100.000 个条目的数据填充到已经存在的对象中。这样,在上传所有数据之前,GC 就不必清除它们。 这将需要一种将查询结果保存到现有对象/对象列表中的方法。我在 ObjectBox 文档中找不到这个。

  2. 数据库中以某种流的形式读取数据,并且在上传过程中根本不将它们表示为对象。我也无法在 ObjectBox 中找到此功能

您知道支持这些方法之一的 ObjectBox 功能吗? 你知道解决这个问题的不同方法吗?

我目前使用

查询数据

return sensorDataBox.query { }.find(offset = 0,limit = 100000)

以前我依赖

sensorDataBox.query { }.findLazy()

但是盒子里有 4000 万个以上的对象,即使是惰性列表也太大了,无法一次检索所有对象。并且没有用于查询惰性列表的限制参数。所以我不得不恢复到 .find(offset,limit)。

如果您需要我提供更多信息,请索取!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。