用于压缩连续正整数的 C 库

2023-12-31

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

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

这表示第一个字符串位于位置 0,第二个字符串位于位置 20,第三个字符串位于位置 500,第 n 个字符串位于位置 103434。

这些位置始终是按顺序排列的非负 64 位整数。尽管数字可能因差异而有所不同,但实际上我预计典型差异在 2^8 到 2^20 的范围内。我希望这个索引在内存中进行映射,并且位置将被随机访问(假设均匀分布)。

我正在考虑编写自己的代码来进行某种块增量编码或其他更复杂的编码,但是编码/解码速度和空间之间有很多不同的权衡,我宁愿得到一个工作库作为起点甚至可能满足于没有任何定制的东西。

有什么提示吗? C 库是理想的选择,但 C++ 库也可以让我运行一些初始基准测试。

如果您仍在关注,请提供更多详细信息。这将用于构建类似于 cdb 的库(http://cr.yp.to/cdb/cdbmake.html http://cr.yp.to/cdb/cdbmake.html)在图书馆 cmmph 顶部(http://cmph.sf.net http://cmph.sf.net)。简而言之,它适用于基于大型磁盘的只读关联映射,在内存中具有较小的索引。

由于它是一个库,所以我无法控制输入,但我想要优化的典型用例有数百万个值,平均值大小在几千字节范围内,最大值为 2^31。

作为记录,如果我没有找到可供使用的库,我打算在 64 个整数块中实现增量编码,初始字节指定到目前为止的块偏移量。这些块本身将使用树进行索引,从而为我提供 O(log (n/64)) 访问时间。还有太多其他选择,我不想讨论它们。我真的很期待准备好使用代码,而不是如何实现编码的想法。一旦我开始工作,我将很高兴与大家分享我所做的事情。

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


I use fastbit https://sdm.lbl.gov/fastbit/(Kesheng Wu LBL.GOV),看来你需要一些好的、快速的、现在的东西,所以 fastbit 是对 Oracle BBC(字节对齐位图代码,berkeleydb)的一个非常有竞争力的改进。它很容易设置并且总体上非常好。

然而,如果有更多时间,您可能想看看格雷码 http://www.imfm.si/preprinti/PDF/01085.pdf解决方案,它似乎最适合您的目的。

Daniel Lemire 有许多 C/++/Java 库,发布于谷歌代码 http://code.google.com/u/lemire/,我读过他的一些论文,它们非常好,在 fastbit 和使用排列格雷码的列重新排序的替代方法方面取得了一些进展。

差点忘了,我也遇到过东京内阁 http://tokyocabinet.sourceforge.net/,虽然我认为它不太适合我当前的项目,但如果我以前知道它,我可能会更多地考虑它;),它具有很大程度的互操作性,

东京内阁是用C写的 语言,并作为 C 的 API 提供, Perl、Ruby、Java 和 Lua。东京 平台上有柜子 其API符合C99和 POSIX。

正如您提到的 CDB,TC 基准​​测试具有 TC 模式(TC 支持针对不同性能的多种操作约束),其中读取性能超过 CDB 10 倍,写入性能超过 CDB 2 倍。

关于您的增量编码要求,我非常有信心bsdiff http://www.daemonology.net/bsdiff/而且它的性能优于任何 file.exe 内容修补系统,它还可能具有一些基本接口来满足您的一般需求。

谷歌新的二进制压缩应用程序,西葫芦 http://dev.chromium.org/developers/design-documents/software-updates-courgette可能值得一看,以防万一您错过了新闻稿,在我见过的发布的一个测试用例中,差异比 bsdiff 小 10 倍。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于压缩连续正整数的 C 库 的相关文章

  • 线程独占数据:如何存储和访问?

    NET 中是否有可能将对象实例绑定到线程的当前执行上下文 这样在代码的任何部分我都可以做类似的事情CurrentThread MyObjectData DoOperation 并确保我访问特定于线程的数据 谢谢 你可以看一下线程静态属性 h
  • C语言实现延时函数

    我想使用空循环实现延迟函数 但是完成一次循环所需的时间取决于编译器和机器 我希望我的程序自行确定时间并将程序延迟指定的时间 谁能给我任何想法如何做到这一点 注意 有一个名为delay 的函数可以将系统暂停指定的毫秒 是否可以在不使用此功能的
  • 表达式访问者仅为某些 lambda 表达式调用 VisitParameter

    我希望能够使用嵌套扩展方法将 EF 中的实体投影到相应的视图模型 参见我之前的问题使用扩展方法在 EF 中投影单个实体 https stackoverflow com questions 39585427 projection of sin
  • 错误:“运行所选代码生成器时出错:包恢复失败”

    我正在尝试将控制器添加到 ASP NET Core 项目中的解决方案中 当我尝试这样做时 我收到此错误 我收到相同的消息 为控制器添加最小依赖项和完整依赖项 我也有这个问题 使用实体框架添加控制器 gt 带有操作的 API 控制器 将给出
  • 为什么 fgets 接受 int 而不是 size_t?

    功能如strcpy malloc strlen 和其他各种接受他们的参数或返回值作为size t代替int or an unsigned int出于显而易见的原因 一些文件功能 例如fread and fwrite use size t以及
  • C++ 并行任务的开销

    我有以下简单的功能 include
  • C 链表销毁函数

    我正在尝试学习 C 和很多人一样 我对指针有点困惑 无论如何 我创建了一个递归函数来销毁我的链表 但是正如我调试的那样 当我从函数返回时 列表的头部不应该为空 所以我猜这是对指针的一些基本误解 这是函数 void destroy struc
  • 为什么 ObservableCollection 有两个集合构造函数?

    The 可观察集合 T https msdn microsoft com en us library ms668604类有两个构造函数 可以在其中传递项目集合 一个构造函数接受一个IEnumerable T 另一个List T 鉴于List
  • 使用 LINQ 展平嵌套字典

    所以我有一本形式的字典Dictionary
  • 有没有办法找到dll公开的所有函数

    我一直在寻找一种方法来获取映射到 dll 中函数名称的所有字符串 我的意思是您可以调用 GetProcAddress 的所有字符串 如果你对 dll 进行十六进制转储 符号 字符串 就在那里 但我认为必须有一个系统调用来获取这些名称 如果您
  • 用 OpenCL C 编写快速线性系统求解器

    我正在编写一个 OpenCL 内核 它将涉及求解线性系统 目前我的内核太慢了 提高线性系统部分的性能似乎是一个不错的起点 我还应该注意 我并没有尝试使我的线性求解器并行 我正在研究的问题在宏观层面上已经是令人尴尬的并行 以下是我编写的 C
  • Web浏览器控件:如何捕获文档事件?

    我正在使用 WPF 的 WebBrowser 控件加载一个简单的网页 在这个页面上我有一个锚点或一个按钮 我想在我的应用程序后面的代码中 即在 C 中 捕获该按钮的单击事件 WebBrowser 控件是否有办法捕获加载页面元素上的单击事件
  • 可以通过模板间接访问基类中的私有类型

    我试图在编译时根据类型是否在给定范围内公开可用来选择要使用的类型 最好直接看代码 include
  • _MM_TRANSPOSE4_PS 在 GCC 中导致编译器错误?

    我第一次在 GCC 而不是 MSVC 中编译我的数学库 并经历了所有的小错误 我遇到了一个根本没有意义的错误 Line 284 error lvalue required as left operand of assignment 284号
  • 是否自初始化 'A a = a;'允许吗?

    此代码在运行时在复制构造函数中失败 但编译器 MSVS2008 没有发出警告 您能解释一下 最好引用标准 这段代码是否非法或什么 我理解 A a a 永远不应该写在第一位 但我正在寻找理论背景 class A public A p new
  • 使用左连接获得不适当的输出

    我正在尝试获取变体列表 并且对于每个变体都获取所有subvariants list无论子变体属于何处 特别的Test say 100 这是示例数据 Id TestId SourceSubVariantId TargetSubVariantI
  • 使用“const cv::Mat &”、“cv::Mat &”、“cv::Mat”或“const cv::Mat”作为函数参数的区别?

    我已经彻底搜索过 但没有找到一个简单的答案 传递 opencv 矩阵 cv Mat 作为函数的参数 我们传递一个智能指针 我们对函数内部的输入矩阵所做的任何更改也会改变函数范围之外的矩阵 我读到 通过将矩阵作为 const 引用传递 它不会
  • C++ 在预处理器 #if 中对 sizeof() 比较抛出编译错误

    我有这个 它不会从 Visual Studio 编译错误 致命错误 C1017 无效的整数常量表达式 我该怎么做 template
  • Selenium - 模式对话框存在 - 如何接受信息?

    我有以下问题 在页面上提交一些日期后 我有一个如图所示的模式对话框 我想单击 ENTER 来浏览该模式 但它不起作用 我有以下代码 driver FindElement By CssSelector input submit Click A
  • DbContext.SaveChangesAsync 异常处理

    当搭建新的脚手架时ApiController通过 Visual Studio 2013 中的异步操作和实体框架支持 某些方法可以包装DbContext SaveChangesAsync https msdn microsoft com en

随机推荐

  • 跟踪 Erlang 中从邮箱消费消息的操作

    我浏览了文档trace 3Erlang 中的 BIF 然而 我的一个观察结果是它不能用于跟踪邮箱中消息的使用情况 旗帜 receive 仅跟踪消息何时添加到进程的邮箱 有没有一种方法可以跟踪事件 例如使用receive构造 如果不是 是否有
  • 未报告的异常 java.sql.SQLException;必须被抓住还是被宣告被抛出? [复制]

    这个问题在这里已经有答案了 我在尝试编译以下代码时遇到此错误 我想知道我做错了什么 unreported exception java sql SQLException must be caught or declared to be th
  • 如何在Android中正确实现feed(类似于Facebook/Instagram)?

    我对 Android 很陌生 我正在尝试创建一个包含大量图像和一些元数据的社交应用程序 它有一个类似于 Facebook 上的信息流的屏幕 我想让这个屏幕尽可能的平滑和标准 以下是我正在使用的库 OkHttp Picasso Retrofi
  • Xcode 如何找到隐式目标依赖项?

    Xcode 有时会自动查找依赖项 我认为当我是定义关系的人并且当我变得懒惰时 这是可以的 但我经常发现自己面临着一个具有多个目标的现有 中型到大型 项目 由于该项目是由其他人制作的 因此我发现很难理解哪些目标取决于什么并非所有关系都是明确的
  • 如何使用 WCF 连接 Apple 的 GSX NewGeneration Web 服务?

    从 2015 年 8 月 15 日开始 Apple 的 GSX Web 服务将升级到更安全的版本 每个请求都需要客户端 SSL 证书 我需要采取哪些步骤才能使用 WCF 框架和 C NET 连接到这个新一代 Web 服务 Apple 的文档
  • Selenium (Python) - 单击按钮元素但不将页面重定向到目标链接

    我正在 Python 中使用 Selenium 测试 Web UI 我遇到了一个测试用例 其中按钮单击后应重定向到另一个页面 但是 每次代码执行时都没有任何异常 但页面仍然没有被重定向 我确信按钮被正确单击 因为按钮动画和鼠标光标发生变化
  • Excel:使用工作表作为函数?

    我有一个 Excel 工作表 它接受两个输入并生成一个输出 我当前可以打开工作表 将两者键入单元格 A1 和 A2 结果显示在 A3 中 有没有办法可以将其变成函数或子例程 以便我可以在另一个工作表中使用它来填写值表 数据表 http of
  • Code Golf:验证数独网格

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 介绍 有效的数独网格由数字 1 到 9 填充 并且数字在 9 行或列的每个子块中出现的次数不会
  • Grails jQuery Mobile 应用程序中的 Spring Security 刷新错误

    我有一个 Grails 2 0 1 jQuery Mobile 应用程序 这是我第一次使用 Spring Security 我遵循了 Peter Ledbrook 的出色指示post http blog springsource org 2
  • 如何将 pg_dump 与连接 uri / url 一起使用?

    我可以调用psql像这样 psql postgres 我该如何使用pg dump带有以下格式的连接字符串postgres 比将 URI 分解为主机 帖子 用户名 密码更方便 有这方面的语法吗 pg dump postgres usernam
  • MySQL 无法在 AMPPS OS X 上启动

    我在使用 AMPPS 启动 mysql 时遇到问题 我正在使用 OS X Mavericks 和最新版本的 Ampps 在小系统崩溃并重新启动后 我无法启动 mysql mysql 错误 2014 01 22 18 12 41 398 No
  • C# 获取机器IP地址的方法

    如何在 C 中获取机器的 IP 地址 IPAddress localIPs Dns GetHostAddresses Dns GetHostName 您的计算机没有单个 IP 地址 并且某些返回的地址可能是 IPv6 MSDN 链接 Dns
  • 获取视频上传的确切时间

    我正在使用Youtube API http gdata python client googlecode com svn trunk pydocs gdata html使用关键字查询进行搜索 import gdata youtube imp
  • ASP.NET MVC3 - “对象引用未设置到对象的实例”错误

    我对 NET 和 MVC3 比较陌生 尝试添加对象的实例时 我遇到了上述错误消息的问题 下面是我的代码 关键日期类 public class KeyDate Key public int KeyID get set StringLength
  • 如何将我的解决方案纳入 Windows 问题报告和解决方案

    Windows Vista 添加了问题报告和解决方案功能 用于记录软件问题 将其报告给 Microsoft 然后表示他们会收集这些问题的解决方案并提供给用户 因此 当我的程序遇到错误并崩溃时 用户会收到异常报告 source beholdg
  • 单击时不要隐藏 OverlayPanel

    我想做 PrimeFaces覆盖面板 http www primefaces org showcase labs ui overlayPanel jsf即使用户单击工具提示之外的区域也保持可见 关闭工具提示的唯一方法是使用其上的 关闭 按钮
  • Apiary:将 API 导出为 JSON,以生成客户端代码

    我们都知道养蜂场很强大 或者不是 我认为确实如此 我想知道如何才能更进一步允许用户导出 API 的 JSON 描述 因此开发人员可以编写客户端代码生成脚本 这应该有帮助 http ttezel github io blog 2013 02
  • c中的序列点

    命令式编程中的序列点定义了计算机程序执行中的任何点 在该点处保证先前评估的所有副作用都已执行 并且尚未执行后续评估的任何副作用 这是什么意思 有人可以用简单的话解释一下吗 当序列点发生时 基本上意味着您可以保证之前的所有操作都已完成 在没有
  • 启动投射设备的投射会话

    我有这个用例 检测播放设备并保存其 ID 名称和信息 以自动方式连接到预定义设备并开始投射会话 有一些内容 我研究了 Google Cast API v3 看起来真的很难 在 v2 中 这是可能的 因为发送者应用程序控制了 90 的进程 即
  • 用于压缩连续正整数的 C 库

    我有一个非常常见的问题 即为磁盘中的字符串数组创建索引 简而言之 我需要将每个字符串的位置存储在磁盘内表示中 例如 一个非常简单的解决方案是索引数组 如下所示 uint64 idx 0 20 500 1024 103434 这表示第一个字符