我最近尝试了leveldb,我发现一些单次操作会很长(最长的是10s),但是非常低(约0.01%)。我设置写缓冲区256m,我的值约为64k。 有人可以帮助我吗?非常感谢你!
答案 0 :(得分:0)
根据我对LevelDB的理解,64K值比LevelDB优化的值大得多。由于LevelDB以排序的方式存储密钥,因此一个具有大值的密钥可能需要它来更新许多内部数据块。如果64K是您需要的固定大小的平均大小,那么您可能想要在头文件中调整它的一些参数。
但是10s似乎太长了。您确定没有其他来源会影响正在运行的流程吗?你能分享一些更多的细节,比如总密钥数,访问/更新模式吗?
答案 1 :(得分:0)
如果你在谈论插入(PUT)。您可能会看到一些长延迟请求。 LevelDB在缓冲写入超过阈值时将SSTables(日志结构,不可变,数据单元)写入磁盘(默认情况下为2MB)。这些新的SSTable写入Level-0。
SSTables在磁盘上累积,LevelDB将这些SSTable与旧的SSTable合并。有几个级别的SSTables,并且合并(称为压缩)在每两个连续级别上运行。
从Level-0开始,合并发生在eahc对上,如(L0,L1),(L2,L3)等。 关键是,当执行某种(L2,L3)或(L4,L5)压缩时,写入将在其他级别上停止。 LevelDB以大型单元进行数据重组,一次压缩通常涉及数十兆字节。因此,当它发生时,您将看到PUT操作排队,并且必须等到压缩完成。