我在一个处理数十亿需要映射/排队的对象的项目中使用MapDB . 即使阅读了docs,我也不会对MapDB的commit()函数(我认为与性能相关)感到困惑 . 我的问题:
提交究竟做了什么?我的工作理解是它将对象从堆序列化到磁盘,从而释放堆空间 . 这准确吗?
对刚刚提交的对象的引用会发生什么?它们是否被GC清理干净,或者他们以某种方式“引用”磁盘上的对象(使用MapDB使其透明?)
最终我想知道如何尽可能高效地使用MapDB,但是如果不知道commit()是什么,我就不能这样做 . 我非常感谢您有效使用MapDB的任何其他建议 .
最好不要在对您制作的 Map 进行每次更改后尝试提交,而是在某种时间表上执行此操作 .
喜欢
每 N 更改
N
每 M 秒
M
在代码中的某种逻辑检查点之后 .
执行太多提交会使您的应用程序变得非常慢 .
commit 操作是transactions上的操作,就像您在数据库系统中找到的那样 . MapDB实现了事务,因此 commit 实际上是对这个数据库的永久性和对其他用户可见的 . 免费操作是 rollback ,它会丢弃您(直接)影响内存和不存在内容的所有更改 . 如果您正在尝试回收堆空间,您可能希望查看 compact() .
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会隐藏它是在内存中还是在您的磁盘上,并且只返回对检索到的对象的可用引用 . 检索到的对象将在内存中挂起,直到它变成垃圾,就像其他任何东西一样 .
get
2 回答
最好不要在对您制作的 Map 进行每次更改后尝试提交,而是在某种时间表上执行此操作 .
喜欢
每
N
更改每
M
秒在代码中的某种逻辑检查点之后 .
执行太多提交会使您的应用程序变得非常慢 .
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会隐藏它是在内存中还是在您的磁盘上,并且只返回对检索到的对象的可用引用 . 检索到的对象将在内存中挂起,直到它变成垃圾,就像其他任何东西一样 .