首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >索引压缩库

索引压缩库
EN

Stack Overflow用户
提问于 2011-08-03 02:13:47
回答 1查看 266关注 0票数 1

我正在使用一个压缩大文件(40 GB)的系统,然后将它们存储在归档中。

目前我正在使用libz.a用C++压缩文件,但是当我想要从文件中提取数据时,我需要解压整个文件。有没有人知道一个压缩组件(最好是.NET兼容的),它可以存储原始文件位置的索引,然后,而不是解压缩整个文件,查找所需的内容?

示例:

代码语言:javascript
复制
Original File       Compressed File
10 - 27         =>  2-5
100-202         =>  10-19
..............
10230-102020    =>  217-298

因为我知道文件中需要的数据只出现在位置10-27之间的原始文件中,所以我想要一种将原始文件位置映射到压缩文件位置的方法。

有没有人知道可以提供这种功能的压缩库或类似的现成工具?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-03 06:12:14

我不确定这是否会对你有很大帮助,因为解决方案取决于你的需求,但我也遇到了类似的问题,我正在处理的项目(至少我认为是这样),我不得不在驱动器上保存许多文本文章,并以相当随机的方式访问它们,并且由于数据的大小,我不得不压缩它们。

一次压缩所有这些数据的问题是,大多数算法在解压缩数据时都依赖于以前的数据。例如,流行的LZW方法在运行时创建adictionary (关于如何解压缩数据的指令),同时进行解压缩,因此从中间解压流是不可能的,尽管我相信这些方法可能会进行调整。

我发现的解决方案是最好的,尽管它确实降低了压缩比,那就是将数据打包成块。在我的项目中很简单-每篇文章都是1个块,我把它们一一压缩,然后创建一个索引文件来保存每个“块”开始的位置,在这种情况下解压缩很容易-只需解压缩整个流,这是我想要的一篇文章。

所以,我的文件是这样的:

Index; compress(A1); compress(A2); compress(A3)

而不是

compress(A1;A2;A3)

如果你不能以这种优雅的方式拆分数据,你总是可以尝试人为地拆分块,例如,将数据打包成5MB的块。因此,当您需要读取从7MB到13MB的数据时,只需解压缩块5-10和10-15即可。然后,您的索引文件将如下所示:

代码语言:javascript
复制
0     -> 0
5MB   -> sizeof(compress 5MB)
10MB  -> sizeof(compress 5MB) + sizeof(compress next 5MB)

这种解决方案的问题是,它提供的压缩比略差。块越小,压缩效果就越差。

还有:有许多数据块并不意味着你必须在硬盘中有不同的文件,只需将它们一个接一个地打包到一个文件中,并记住它们何时启动。

另外:http://dotnetzip.codeplex.com/是一个用c#编写的很好的库,用于创建可以用来压缩的压缩文件。对我来说工作得很好,你可以使用它的内置功能,在一个zip文件中创建许多文件来处理将数据分成块的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6916599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档