首页 文章

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

提问于
浏览
9

我在一个处理数十亿需要映射/排队的对象的项目中使用MapDB . 即使阅读了docs,我也不会对MapDB的commit()函数(我认为与性能相关)感到困惑 . 我的问题:

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

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

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

2 回答

  • 0

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

    喜欢

    • N 更改

    • M

    • 在代码中的某种逻辑检查点之后 .

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

  • 3

    commit 操作是transactions上的操作,就像您在数据库系统中找到的那样 . MapDB实现了事务,因此 commit 实际上是对这个数据库的永久性和对其他用户可见的 . 免费操作是 rollback ,它会丢弃您(直接)影响内存和不存在内容的所有更改 . 如果您正在尝试回收堆空间,您可能希望查看 compact() .

    对于你的第二个问题,如果你're holding a strong reference to an object then you continue holding that strong reference. MapDB isn' t将为你删除它 . 在大多数情况下,您应该将MapDB视为普通的Java Map . 当您调用 get 时,MapDB会隐藏它是在内存中还是在您的磁盘上,并且只返回对检索到的对象的可用引用 . 检索到的对象将在内存中挂起,直到它变成垃圾,就像其他任何东西一样 .

相关问题