用于随机访问压缩数据文件的简单API

时间:2010-07-01 16:08:37

标签: c++ compression gzip random-access

请推荐适合以下任务的技术。

我有一个相当大的(500MB)数据块,基本上是一个数字矩阵。数据熵很低(应该是可以很好地压缩的)并且存储位置很昂贵。

我正在寻找的是用一个好的压缩算法(比如说,GZip)压缩它,并使用能够偶尔随机访问的标记。随机访问,如“从原始(未压缩)流中的位置[64位地址]读取字节”。这与ZLIB等经典的deflator库有点不同,它可以让你连续解压缩流。我想要的是,在每个字节读取的延迟时间内进行随机访问,例如,多达1MB的解压缩工作。

当然,我希望使用现有的库而不是重新发明NIH轮。

8 个答案:

答案 0 :(得分:2)

如果您使用的是Java,我刚刚发布了一个库:http://code.google.com/p/jzran

答案 1 :(得分:1)

Byte Pair Encoding允许随机访问数据。

你不会得到那么好的压缩,但你牺牲了一棵树的自适应(变量)哈希树,所以你可以访问它。

但是,您仍需要某种索引才能找到特定的“字节”。由于您可以使用1 MB的延迟,因此您将为每1 MB创建一个索引。希望您能找到一种方法,使您的索引足够小,仍然可以从压缩中受益。

此方法的一个好处是随机访问编辑。您可以用相对较小的块更新,删除和插入数据。

如果很少访问它,您可以使用gzip压缩索引并在需要时对其进行解码。

答案 2 :(得分:1)

如果您想最大限度地减少所涉及的工作,我只需将数据分成1 MB(或其他)块,然后将这些块放入PKZIP存档中。然后,您需要一小部分前端代码来获取文件偏移量,并除以1M以获得正确的文件进行解压缩(显然,使用余数来获取该文件中的正确偏移量)。 / p>

编辑:是的,现有代码可以处理这个问题。最新版本的Info-zip解压缩(6.0是最新的)包括api.c。除此之外,还包括UzpUnzipToMemory - 您传递ZIP文件的名称,以及您要检索的该存档中的一个文件的名称。然后,您将获得一个包含该文件内容的缓冲区。要进行更新,您需要使用api.cZpInit来使用zip3.0中的ZpArchive(尽管这些并不像解压缩方那样简单)。

或者,您可以在后台运行zip / unzip副本来完成工作。这不是很整洁,但实施起来无疑更简单(如果您愿意,还可以让您轻松切换格式)。

答案 3 :(得分:0)

压缩算法通常以块的形式工作我认为你可以根据块大小来提出一些东西。

答案 4 :(得分:0)

我建议使用Boost Iostreams Library。 Boost.Iostreams可用于创建访问TCP连接的流或用作加密和数据压缩的框架。该库包括用于访问内存映射文件,使用操作系统文件描述符进行文件访问,用于代码转换,用于正则表达式的文本过滤,用于行结束转换以及用于zlib,gzip和bzip2格式的压缩和解压缩的组件。

Boost库已被C ++标准委员会接受为TR2的一部分,因此最终将内置于大多数编译器(under std::tr2::sys)。它也是跨平台兼容的。

Boost Releases

Boost Getting Started Guide注意:只有boost::iostreams的某些部分是仅限标题的库,在链接时不需要单独编译的库二进制文件或特殊处理。

答案 5 :(得分:0)

  1. 首先排序大文件
  2. 将你的欲望大小(1MB)除以名称中的某个序列(File_01,File_02,..,File_NN)
  3. 从每个块中获取第一个ID加上文件名,并将两个数据放入另一个文件
  4. 压缩块
  5. 您可以使用您希望的方法搜索ID文件,可以是二进制搜索并根据需要打开每个文件。
  6. 如果您需要深度索引,可以使用BTree算法,“pages”是文件。 在网上存在几个实现,因为代码有点棘手。

答案 6 :(得分:0)

你可以使用bzip2并根据James Taylor的seek-bzip2

轻松制作自己的API

答案 7 :(得分:0)

看看我的项目 - csio。我认为这正是您所寻找的:包括类似stdio的接口和多线程压缩器。

它是用C编写的库,它提供CFILE结构和函数protected void Page_Load(object sender, EventArgs e) { if (Session["user"] != null) { txtName.Text = Session["user"].ToString(); } cfopencfseek等。您可以将它与常规(非压缩)文件和文件一起使用,并在dzip实用程序的帮助下进行压缩。该实用程序包含在项目中并使用C ++编写。它生成有效的gzip存档,可以由标准实用程序和csio处理。 dzip可以在很多线程中压缩(参见cftello选项),因此它可以非常快速地压缩非常大的文件。

典型用法:

-j

它是MIT许可的,因此您可以在您的项目中无限制地使用它。有关更多信息,请访问github上的项目页面:https://github.com/hoxnox/csio