2013-08-03 21 views
4

我需要做的是压缩文件的64KB块,因为它们是从外部服务进入的,然后将所有压缩数据实时传输到浏览器。 Xceed Real-Time在如何设置文件头部,然后将多个64KB块拼接成客户端上的整个压缩文件方面非常出色。这很好,你可以很容易地处理多个文件,把它放在一个循环中。是否有免费的压缩实用程序,像Xceed Real-Time Zip一样实时压缩?

我的问题是:是否有一个免费的替代压缩工具可以匹配Xceed的复杂性?我需要一些可以将文件的一部分压缩并传输到浏览器的东西。几乎所有我见过的免费选择都需要在压缩发生之前访问整个文件。 Xceed很棒,但价格昂贵。只是想知道是否有一个可以实现这一目标的免费选择。谢谢!

回答

6

您正在寻找的是流压缩方法。好消息是你有很多选择。另请注意,您必须考虑内存,因为某些解决方案(基于字典)可能需要大量内存,因此需要进行测试和调整。

为了保持我的答案,我建议给LZ4一个尝试。

LZ4 - http://code.google.com/p/lz4/

LZ4是一个非常快的无损压缩算法,以每300核心MB/s的,可伸缩的多芯CPU提供 压缩速度。 它还具有极速解码器,速度以GB/s为单位,每 内核,通常达到多核系统的RAM速度限制。

基准:

Name   Ratio C.speed D.speed 
         MB/s MB/s 
LZ4 (r97)  2.084 410 1810 
LZO 2.06  2.106 409  600 
QuickLZ 1.5.1b6 2.237 373  420 
Snappy 1.1.0 2.091 323 1070 
LZF    2.077 270  570 
zlib 1.2.8 -1 2.730  65  280 
LZ4 HC (r97) 2.720  25 2040 
zlib 1.2.8 -6 3.099  21  300 

有很多可用的实现时,请确认:http://code.google.com/p/lz4/

LZO - http://lzo-net.sourceforge.net/

LZO.Net带来马库斯 “FXJ” Oberhumer的伟大LZO压缩 库(V1.08)到.NET的力量。它使用一个小C#类对原生 DLL进行访问,保持ANSI-C 库的原始速度。

斯纳皮 - https://code.google.com/p/snappy/

斯纳皮是压缩/解压缩库。它不旨在最大压缩为 ,或与其他任何压缩库的兼容性为 库;相反,它的目标是非常高的速度和合理的压缩。

两个C#机实现可供选择:

QuickLZ - http://www.quicklz.com/

QuickLZ是世界上速度最快的压缩库,每个内核达到了308Mbps/s/s。如果已经获得此类 或者在GPL 1,2或3下,可以在商业许可下使用它,其中任何发布到 的公众必须是开源的。

本地实现 - QuickLZ C#

So far, only a subset of the library has been ported, 
namely the setting: 

QLZ_COMPRESSION_LEVEL = 1 or 3 
QLZ_STREAMING_BUFFER = 0 
QLZ_MEMORY_SAFE = 0 
+0

我需要一个c#实现库。你有没有一个例子说明如何使用FastLZ为动态文件创建标题,然后将其余的标记标记到该标题? Xceed内置此功能。谢谢! – TheDude

+1

我已经更新了答案。我确实删除了FastLZ,因为它不适合你。所以你有4个选项:LZ4,LZO,Snappy,QuickLZ(基准测试的顶部)。 LZO是一个包装。 QuickLZ C#实现有一些限制。无论如何,你可以和LZ4或Snappy一起去。 –

+0

LZ4可以解压缩压缩文件吗? – zer0ne

1

退房SharpCompress,专门为目的,如你写的。我使用它并且适用于我的解决方案。我们在重写之前使用了Xceed。

http://sharpcompress.codeplex.com/

SharpCompress是.NET /单声道/ Silverlight的/ WP7能的unrar,un7zip,解压缩,解压缩unbzip2和ungzip与只进读取和文件随机访问的API压缩库。写支持zip/tar/bzip2/gzip被实现。

主要功能是支持不可查找的流,因此大文件可以即时处理(即下载流)。

+0

您是否有过如何使用SharpCompress实时压缩64KB块的例子?使用Xceed时,内置了为每个文件创建标题的功能,然后将64KB块标记为该文件标题。 SharpCompress是否有类似的功能?希望能举一个例子! – TheDude