【发布时间】:2009-07-04 20:20:42
【问题描述】:
我有一个非常常见的问题,即为磁盘中的字符串数组创建索引。简而言之,我需要将每个字符串的位置存储在磁盘表示中。例如,一个非常简单的解决方案是索引数组,如下所示:
uint64 idx[] = { 0, 20, 500, 1024, ..., 103434 };
表示第一个字符串在位置 0,第二个在位置 20,第三个在位置 500,第 n 个在位置 103434。
位置总是按顺序排列的非负 64 位整数。尽管数字可能会因任何差异而有所不同,但实际上我希望典型差异在 2^8 到 2^20 的范围内。我希望这个索引在内存中被映射,并且位置将被随机访问(假设均匀分布)。
我正在考虑编写自己的代码来执行某种块增量编码或更复杂的编码,但编码/解码速度和空间之间存在许多不同的权衡,我宁愿获得一个工作库作为一个起点,甚至可以满足于没有任何自定义的东西。
有什么提示吗?一个 c 库是理想的,但一个 c++ 库也可以让我运行一些初始基准测试。
如果您仍在关注,请提供更多详细信息。这将用于在库 cmph (http://cmph.sf.net) 之上构建一个类似于 cdb (http://cr.yp.to/cdb/cdbmake.html) 的库。简而言之,它适用于内存中索引较小的基于大磁盘的只读关联映射。
由于它是一个库,我无法控制输入,但我要优化的典型用例有数百万个值,平均值大小在几千字节范围内,最大值在 2^31 .
作为记录,如果我没有找到可以使用的库,我打算在 64 个整数的块中实现增量编码,初始字节指定到目前为止的块偏移量。块本身将用树索引,给我 O(log (n/64)) 访问时间。还有太多其他选择,我不想讨论它们。我真的很期待准备好使用代码,而不是关于如何实现编码的想法。我很乐意与大家分享我所做的一切。
感谢您的帮助,如果您有任何疑问,请告诉我。
【问题讨论】:
-
访问要求是什么?随机的 ?顺序?只有先到最后?索引值大小是多少(32、48、64 位)?索引值是完全随机的(平坦分布)还是我们可以使用一些内部关系?
-
另一个问题...看看这个例子,索引值似乎是按递增顺序排列的。 delta 值是多少?
-
访问应该是随机的。假设均匀分布。索引条目是 64 位整数。它们的增量遵循它们指向的值大小的相同分布:几千字节。
-
你会在磁盘上使用与内存中相同的数据结构吗?
-
索引应该在内存中(mmap'ed),而数据(字符串)将存在于磁盘中。如果这是一个问题,请考虑所有小端。
标签: c database data-structures encoding compression