如何按值对 LevelDB 进行排序

Posted

技术标签:

【中文标题】如何按值对 LevelDB 进行排序【英文标题】:How to sort LevelDB by value 【发布时间】:2011-11-07 23:53:58 【问题描述】:

我使用leveldb 来存储记录(键值),其中键是 64 位散列,值是双精度值。打个比方:认为 64 位散列是客户的唯一 ID,双倍是帐户余额(即他们的帐户中有多少钱)。我想按账户余额对数据库进行排序,并首先列出账户余额最高的客户。但是,数据库无法放入内存,因此我必须使用其他方法对其进行排序,以便按帐户余额进行排序。

我正在考虑使用STXXL,但它要求我将数据库的副本复制到单个平面文件中,然后我可以使用 STXXL 进行外部排序(这会生成一堆较小的文件,排序然后将它们合并到另一个平面文件中)。是否有更好的数据排序方法或者我应该使用 STXXL 排序?

【问题讨论】:

【参考方案1】:

你有多少条目?是否可以将无符号 32 位整数用作索引(允许 4,294,967,296 个索引),用于识别如何对原始数组进行排序?

即创建成对的 32 位索引和账户余额,对余额进行排序,然后使用 32 位索引计算出原始数据的顺序?

【讨论】:

那么我想我也可以使用 64 位索引,对吧?密钥可能是<double, uint64>... 我以为你说你不能将完整的数据库加载到内存中?我建议使用 32 位索引作为减少该信息的一种方式。除了 64 位哈希和数量之外,还有更多信息吗? 正确,我不必将它们加载到内存中:您的建议促使我使用另一个 LevelDB 实例进行排序,但在第二个 LevelDB 实例中我会使用不同的键 (<double, uint64>)并且没有价值。所以键将按双精度排序,如果有重复的双精度(会有),那么键的第二部分将发挥作用,它们将按原始唯一哈希排序。这样,我只需要复制一次数据。

以上是关于如何按值对 LevelDB 进行排序的主要内容,如果未能解决你的问题,请参考以下文章

LevelDB源码阅读Cache

[leveldb]0.源码编译及使用

如何按值对 STL 映射进行排序?

如何在 JavaScript 中按值对地图进行排序?

如何按值对计数器进行排序? - Python

如何按值对 Python 字典进行排序? [复制]