10

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

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

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

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

4

2 回答 2

3

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

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

于 2014-09-18T23:10:03.253 回答
0

最好不要在您对地图进行的每一次更改之后都尝试提交,而是按照某种时间表进行。

  • 每一次N改变
  • 每秒钟M_
  • 在代码中的某种逻辑检查点之后。

执行过多的提交会使您的应用程序非常缓慢。

于 2018-06-06T08:38:55.137 回答