有效使用MapDB(对提交感到困惑)

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

  1. 提交究竟做了什么? 我的工作理解是它将对象从堆序列化到磁盘,从而释放堆空间。 这准确吗?

  2. 对刚刚提交的对象的引用会发生什么? 它们是否被GC清理干净,或者他们以某种方式“引用”磁盘上的对象(使用MapDB使其透明?)

最终我想知道如何尽可能高效地使用MapDB,但是如果不知道commit()是什么,我就不能这样做。 我非常感谢您有效使用MapDB的任何其他建议。

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

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

最好不要在对您制作的地图进行每次更改后尝试提交,而是在某种时间表上执行此操作。

喜欢

  • N变化
  • M
  • 在代码中的某种逻辑检查点之后。

执行太多提交会使您的应用程序变得非常慢。