我需要将一个非常大的xml文件压缩到尽可能小的大小。
我在C#工作,我更喜欢它是一些我可以通过我的代码访问的开源或应用程序,但我也可以处理算法。
谢谢!
答案 0 :(得分:10)
它可能不是“可能的最小尺寸”,但您可以使用System.IO.Compression
来压缩它。压缩倾向于为文本提供非常好的压缩。
using (var fileStream = File.OpenWrite(...))
using (var zipStream = new GZipStream(fileStream, CompressionMode.Compress))
{
zipStream.Write(...);
}
答案 1 :(得分:6)
如上所述,高效XML交换(EXI)可以非常一致地实现最佳的XML压缩。即使没有架构,EXI也比拉链小2-5倍并不少见。使用模式,你会做得更好。
如果您不反对商业实现,可以使用.NET版本的Efficient XML,并使用标准.NET API直接从C#代码中调用它。您可以从http://www.agiledelta.com/efx_download.html下载免费试用版。
答案 2 :(得分:3)
如果您有可用于XML文件的架构,则可以尝试EXIficient。它是Efficient XML Interchange(EXI)格式的一种实现,它几乎是最好的通用XML压缩方法。如果你没有架构,EXI仍然比常规zip(deflate算法)更好,但不是很多,特别是对于大文件。
EXIficient只是Java,但您可以将其转换为可以调用的应用程序。我不知道在C#中有任何EXI的开源实现。
答案 3 :(得分:2)
查看XML Compression Tools您还可以使用SharpZipLib
对其进行压缩答案 4 :(得分:2)
文件大小不是EXI(或任何二进制方案)的唯一优势。在读/写时,处理时间和内存开销也大大降低。想象一下,只需复制字节就可以将浮点数复制到磁盘上。现在假设另一个程序将浮点数转换为格式化文本,并将它们粘贴到文本流中,然后通过昂贵的压缩算法提供该流。由于这种荒谬的开销,XML基本上不能用于非常大的文件,这些文件本可以通过二进制表示轻松处理。
二进制XML有望解决XML长期存在的弱点。可以很容易地创建一个在二进制/文本表示之间进行转换的实用程序(不知道XML模式),这意味着您仍然可以在需要时轻松编辑文件。
答案 5 :(得分:1)
XML具有高度可压缩性。您可以使用DotNetZip从XML生成压缩的zip文件。
答案 6 :(得分:1)
如果您需要最大压缩等级,我会推荐LZMA。有一个SDK(包括C#)是开源7-Zip项目的一部分,可用here。
答案 7 :(得分:1)
如果您正在寻找尽可能小的尺寸,请尝试使用Fast Infoset作为二进制XML编码,然后使用BZIP2或LZMA进行压缩。您可能会比压缩文本XML或使用EXI获得更好的结果。 FastInfoset.NET包括Fast Infoset标准的实现和几种压缩格式可供选择,但它是商业化的。