2011-08-02 59 views
0

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

目前我使用libz.a压缩与C++中的文件,但是当我想要得到的数据出来的文件我需要提取整个事情。有谁知道一个压缩组件(最好与.NET兼容),可以存储原始文件位置索引,然后,而不是解压缩整个文件,寻求什么是需要的?

例子:

Original File  Compressed File 
10 - 27   => 2-5 
100-202   => 10-19 
.............. 
10230-102020 => 217-298 

因为我知道我需要在文件中只发生在10-27位置之间的原始文件中的数据,我想一种映射原始文件位置的压缩文件位置。

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

+1

我在这里看到的问题是,大多数压缩算法不支持这种功能。因为fe。解压缩100-202需要先前的数据。如果是fe,你能否扩展你的问题?你知道未来将要解压的原始文件的哪些部分?所以你确定,你会减压100-202,而不是90-220?这可以帮助我想 –

回答

1

我不知道这是否会帮助你很多,作为解决方案取决于您的需求,但我有项目我的工作(至少我是这么认为的),在那里我有类似的问题将许多文章文章保存在驱动器中,并以相当随机的方式访问它们,并且由于数据量很大,我不得不压缩它们。

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

解决方案,我发现是工作最好的,但它确实减少你的压缩比是块打包数据。在我的项目中很简单 - 每篇文章都是1块,我将它们压缩为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) 

这种解决方案的问题是,它给略差的压缩比。块越小 - 压缩越糟糕。

另外:有许多数据块并不意味着你必须有硬盘驱动器不同的文件,刚刚收拾他们后,对方在一个文件中,并记住,当他们开始。

另外:http://dotnetzip.codeplex.com/是用于创建,您可以使用压缩和写在C#中的zip文件一个漂亮的图书馆。对我来说工作起来相当不错,你可以使用其构建的功能在1个zip文件中创建许多文件,以便将数据拆分为块。