我正在使用压缩大文件(40 GB)的系统,然后将它们存储在存档中。
目前我使用libz.a用C ++压缩文件,但是当我想从文件中获取数据时,我需要提取整个文件。有没有人知道压缩组件(最好是.NET兼容的)可以存储原始文件位置的索引然后,而不是解压缩整个文件,寻找所需的东西?
示例:
Original File Compressed File
10 - 27 => 2-5
100-202 => 10-19
..............
10230-102020 => 217-298
因为我知道文件中我需要的数据只出现在位置10-27之间的原始文件中,所以我想要一种将原始文件位置映射到压缩文件位置的方法。
是否有人知道可以提供此功能的压缩库或类似的现成工具?
答案 0 :(得分:1)
我不确定这是否会对你有很大的帮助,因为解决方案取决于你的要求,但我对我正在研究的项目(至少我是这么认为)有类似的问题,我必须保留关于驱动器的许多文章文章以非常随机的方式访问它们,并且由于数据的大小,我不得不压缩它们。
一次压缩所有这些数据的问题在于,大多数算法在解压缩时依赖于先前的数据。例如,流行的LZW方法在运行时创建adictionary(关于如何解压缩数据的指令),同时进行解压缩,因此无法从中间解压缩流,尽管我相信这些方法可能会针对它进行调整。
我发现解决方案效果最好,虽然它确实降低了你的压缩比,但是要将数据打包成块。在我的项目中它很简单 - 每篇文章都是1个块,我逐个压缩它们,然后创建一个索引文件,保存每个“块”的开始,在这种情况下解压缩很容易 - 只需解压缩整个流,这是一个我想要的文章。
所以,我的文件看起来像这样:
Index; compress(A1); compress(A2); compress(A3)
而不是
compress(A1;A2;A3)
。
如果无法以这种优雅的方式拆分数据,则可以尝试人为地拆分数据块,例如,以5MB块的形式打包数据。因此,当您需要读取7MB到13MB的数据时,您只需解压缩块5-10和10-15。 您的索引文件将如下所示:
0 -> 0
5MB -> sizeof(compress 5MB)
10MB -> sizeof(compress 5MB) + sizeof(compress next 5MB)
此解决方案的问题在于压缩比稍差。块越小 - 压缩越差。
另外:拥有许多数据块并不意味着您必须在硬盘驱动器中拥有不同的文件,只需将它们打包在1个文件中并记住它们何时启动。
另外:http://dotnetzip.codeplex.com/是一个很好的库,用于创建可用于压缩的zip文件,并用c#编写。对我来说工作非常好,您可以使用其在1个zip文件中创建许多文件的构建功能来处理将数据拆分为块。