我在一个处理数十亿需要映射/排队的对象的项目中使用MapDB。程序完成后我不需要任何持久性(MapDB数据库都是临时的)。我希望程序尽可能快地运行,但我对MapDB的commit()函数感到困惑(我认为这与性能有关),即使在阅读docs之后也是如此。我的问题:
提交究竟做了什么?我的工作理解是它将对象从堆序列化到磁盘,从而释放堆空间。这准确吗?
对刚刚提交的对象的引用会发生什么?它们是否被GC清理干净,或者它们以某种方式“引用”磁盘上的对象(使用MapDB使其透明?)
最终我想知道如何尽可能高效地使用MapDB,但是如果不知道commit()是什么,我就不能这样做。我非常感谢您有效使用MapDB的任何其他建议。
答案 0 :(得分:3)
commit
操作是对transactions的操作,就像您在数据库系统中找到的那样。 MapDB实现了事务,因此commit
实际上是“使我对此数据库所做的更改永久保持且对其他用户可见”。免费操作是rollback
,它会丢弃您在当前交易中所做的所有更改。提交不会(直接)影响内存中的内容和内存中的内容。如果您正在尝试回收堆空间,可能需要查看compact()
。
对于你的第二个问题,如果你持有对象的强引用,那么你继续持有那个强引用。 MapDB不会为你删除它。在大多数情况下,您应该将MapDB视为普通的Java Map。当您调用get
时,MapDB会隐藏它是在内存中还是在磁盘上,并且只返回对检索到的对象的可用引用。检索到的对象将在内存中徘徊,直到它变成垃圾,就像其他任何东西一样。
答案 1 :(得分:0)
最好不要在对您制作的地图进行每次更改后尝试提交,而是按照某种计划执行此操作。
喜欢
if(is_array($_POST["menu"][$key])){
更改N
秒执行太多提交会使您的应用程序变得非常慢。