如果您仅从单个线程使用 LMDB,并且根本不关心数据库持久性,是否有任何理由打开和关闭事务?
在单个事务中执行所有操作会导致性能问题吗?打开和关闭太多交易是否会影响性能?
我发现一旦我的 LMDB 数据库变得比可用 RAM 大,它的速度就会急剧下降,但我的 SSD 和 CPU 都没有接近它们的容量。
如果您仅从单个线程使用 LMDB,并且根本不关心数据库持久性,是否有任何理由打开和关闭事务?
在单个事务中执行所有操作会导致性能问题吗?打开和关闭太多交易是否会影响性能?
我发现一旦我的 LMDB 数据库变得比可用 RAM 大,它的速度就会急剧下降,但我的 SSD 和 CPU 都没有接近它们的容量。
如果事务未提交,则无法保证读取器(在不同进程中)可以读取该项目。写事务应该在某个时候提交,以便其他读者可以使用数据。
数据库减速可能仅仅是由于非顺序写入。从这篇文章(https://ayende.com/blog/163330/degenerate-performance-scenario-for-lmdb)来看,非顺序写入需要更长的时间。
如果你不提交你的数据库只会在内存中增长,这将导致操作系统在你用完内存后开始交换,这会影响磁盘,这很慢。
如果您根本不需要持久性,那么请使用内存中的哈希映射,在这种情况下,lmdb 真的不会为您提供任何东西。如果您确实想要持久性但不关心丢失数据,那么请选择一个合理的提交(这取决于值大小,因此请进行实验)比率并提交,即在每 1000 个左右的值之后提交。
如果您提交的频率太低,您只会在单个时间点承担磁盘访问的全部成本,因此我认为分散该负载更有意义。