Android 可以使用磁盘空间对 SQLite 事务进行排队吗?

问题描述 投票:0回答:1

我想与 Androidx Room 进行一笔巨额交易,如下所示:

@Transaction
fun addGeneratedRows() {
  for (i in 0 until 5_000_000) {
    addItem(generateRowWhichTakesUpALotOfMemory())
  }
}
@Insert fun addItem(itm: MyLargeRow) 

现在,我担心如果 Room 在将整个事务写入数据库之前将其存储在 RAM 中,这可能会导致内存不足错误。

但我可以想象它可能会将行缓冲到磁盘上,从而允许垃圾收集器在

for
的传递之间清除对象,因为它们是动态生成的。

嗯,会吗?我似乎找不到它的来源,但也没有找到它绝对不存在的来源。

android android-room
1个回答
0
投票

未经彻底测试,我很确定这对数据库来说不会有问题。 Room 依赖于 SQLite 的事务机制,后者将所有更改的“日志”写入磁盘,因此它可以(几乎)立即原子地提交或回滚整个事务。我不确定日志的多少以及哪些部分在内存中管理,但我很确定原始数据已经在循环期间写入磁盘。 使用您的代码,您可以通过在条目数中添加另一个 0 来轻松测试这一点,并在运行时查看设备的可用内存。

© www.soinside.com 2019 - 2024. All rights reserved.