我正在用Qt编写一个相当天真的SSTable实现。一切都按照承诺的方式工作,读/写/更新/删除操作很好地扩展,但我发现了一个瓶颈,它是将表解析到内存并将内存刷新到磁盘的索引。
我用它作为灵感:https://www.igvita.com/2012/02/06/sstable-and-log-structured-storage-leveldb/
使用磁盘上的压缩SSTable
,在运行时使用QDataStream
解析为内存MemTable
,并使用TableIndex
下的QHash<QString,qint32>
进行访问罩。
现在,在进行一些早期的性能测试时,我发现解析百万个条目的表大约需要2秒钟,并且表格大致相同。通过进一步检查,表本身(正在QByteArray
)在我的计算机上大约40ms被刷新并且在400ms下启用压缩,因此单独存储索引需要两次1.5秒以上。原因是QHash
实际上在序列化时被迭代访问,并且在反序列化时被重建,因此为每个显然非常昂贵的密钥调用qHash
。
我尝试过:
QByteArray
而不是QString
会略有帮助,但同时也会降低查找性能(无论如何这都是闪电般快速的,所以并不是什么大问题。)QList
个对象并手动重建。虽然序列化更快,但重建需要更长的时间,因为在反序列化QList
之后,需要对它们进行迭代并通过各个键值对输入QHash
。我没有尝试过:
我很感激如何解决这个问题,特别是如果有一个我可以使用的技巧我在Qt中不知道和/或如何在不疯狂的情况下自己做哈希。