小编Dav*_*avi的帖子

C库用于压缩顺序正整数

我有一个非常普遍的问题,就是为磁盘内的字符串数组创建一个索引.简而言之,我需要将每个字符串的位置存储在磁盘表示中.例如,一个非常天真的解决方案是索引数组,如下所示:

uint64 idx [] = {0,20,500,1024,...,103434};

其中第一个字符串位于第0位,第二个字符串位于第20位,第三个位于第500位,第n个位于第103434位.

这些位置总是按顺序排列为非负64位整数.虽然数字可能会有所不同,但实际上我认为典型的差异在2 ^ 8到2 ^ 20的范围内.我希望这个索引在内存中是mmap的,并且将随机访问这些位置(假设均匀分布).

我正在考虑编写自己的代码来进行某种块增量编码或其他更复杂的编码,但在编码/解码速度和空间之间有很多不同的权衡,我宁愿把工作库作为一个起点甚至可能在没有任何自定义的情况下解决问题.

任何提示?一个c库是理想的,但是c ++也可以让我运行一些初步的基准测试.

如果您还在关注,还有一些细节.这将被用来建立类似于CDB库(http://cr.yp.to/cdb/cdbmake.html顶部的库CMPH()http://cmph.sf.net).简而言之,它适用于基于磁盘的大型只读关联映射,内存中的索引很小.

既然是一个图书馆,我没有在输入控件,但我要优化典型的用例有数亿值的,在几KB平均值尺寸范围在2 ^ 31最大值.

为了记录,如果我没有找到准备使用的库,我打算在64个整数的块中实现delta编码,其中初始字节指定到目前为止的块偏移量.块本身将用树索引,给我O(log(n/64))访问时间.有太多其他选择,我宁愿不讨论它们.我真的很期待使用代码而不是如何实现编码的想法.我很乐意与大家分享我工作后的所作所为.

感谢您的帮助,如果您有任何疑问,请告诉我.

c database compression encoding data-structures

12
推荐指数
1
解决办法
2031
查看次数

如何在C++中打印方法指针的地址?

例如:

struct A { void m() { } };

void stream_print() {
  void(A::*p)(void) = &A::m;
  std::cerr << p << std::endl;
}

void printf_print() {
  void(A::*p)(void) = &A::m;
  fprintf(stderr, "%p", p);
}
Run Code Online (Sandbox Code Playgroud)

stream_print()函数总是打印"1",这显然不是我想要的.printf_print无法编译,因为p无法转换为void*.

我需要的是一个方法指针的唯一标识符,我可以存储在容器中.我知道这听起来不错,但我正在开发一种可以从中受益的单元测试小玩具.我不担心方法的重载,我知道如何获得指向特定重载的指针.

我正在使用启用了C++ 0x的g ++ 4.4.3.

如果您有任何疑问,请告诉我.

c++

7
推荐指数
1
解决办法
1532
查看次数

标签 统计

c ×1

c++ ×1

compression ×1

data-structures ×1

database ×1

encoding ×1