我在一个处理数十亿个需要映射/排队的对象的项目中使用MapDB。程序完成后,我不需要任何持久性(MapDB数据库都是临时的)。我希望程序尽可能快地运行,但是即使在阅读了docs之后,我也对MapDB的commit()函数(我认为与性能有关)感到困惑。我的问题:

  • commit到底能做什么?我的工作理解是它将对象从堆序列化到磁盘,从而释放堆空间。这是正确的吗?
  • 对刚刚提交的对象的引用会发生什么?它们是否已通过GC清理,还是以某种方式“引用”磁盘上的对象(使用MapDB使其透明)?

  • 最终,我想知道如何尽可能高效地使用MapDB,但是如果不知道commit()的用途,我将无法做到这一点。对于可能有效使用MapDB的其他建议,我将不胜感激。

    最佳答案

    commit操作是对transactions的操作,就像在数据库系统中会发现的那样。 MapDB实现了事务,因此commit实际上是“使对该数据库所做的更改永久化,并且对它的其他用户可见”。补充操作是rollback,该操作会丢弃您在当前事务中所做的所有更改。提交不会(直接)影响内存中的内容和内存中的内容。如果您要回收堆空间,则可能要查看compact()

    对于第二个问题,如果您持有对某个对象的强引用,那么您将继续持有该强引用。 MapDB不会为您删除它。大多数时候,您应该将MapDB视为普通的Java Map。调用get时,MapDB会向您隐藏它是在内存中还是在磁盘上,并仅向您返回对检索到的对象的可用引用。就像其他任何东西一样,检索到的对象将一直在内存中徘徊,直到变成垃圾为止。

    10-08 00:26