2010-01-06 108 views
11

我需要將非常大的xml文件壓縮到最小的可能大小。壓縮XML的最佳方法

我在C#中工作,我寧願它是一些開源或應用程序,我可以訪問通過我的代碼,但我能處理的算法,以及。

謝謝!

+1

我會嘗試Zlib。但是可能會有基於模式的XML到二進制轉換器。 – 2010-01-06 11:50:34

回答

1

XML是高度可壓縮的。您可以使用DotNetZip從您的XML生成壓縮的zip文件。

+0

@Downvoter - 關注評論? – Oded 2011-02-12 19:32:08

10

它可能不是「最小尺寸可以」壓縮它,但你可以使用使用System.IO.Compression對其進行壓縮。壓縮往往能夠爲文本提供非常好的壓縮。

using (var fileStream = File.OpenWrite(...)) 
using (var zipStream = new GZipStream(fileStream, CompressionMode.Compress)) 
{ 
    zipStream.Write(...); 
} 
1

如果您需要最大的壓縮級別,我會推薦LZMA。有一個SDK(包括C#),它是開源7-Zip項目的一部分,可用於here

+0

對於特定於XML的壓縮算法,您可以做得更好。 – vy32 2011-02-12 18:19:15

3

如果您有可用於XML文件的模式,你可以嘗試EXIficient。它是Efficient XML Interchange(EXI)格式的實現,它幾乎是最好的通用XML壓縮方法。如果你沒有一個模式,EXI仍然比普通的zip(即deflate算法)要好,但不是很多,特別是對於大文件。

EXIficient僅僅是Java,但你或許可以把它變成可以調用的應用程序。我不知道C#中EXI的任何開源實現。

6

如上所述,Efficient XML Interchange(EXI)可以非常一致地實現最佳的可用XML壓縮。即使沒有模式,EXI比拉鍊小2-5倍並不罕見。有了模式,你會做得更好。

如果你不反對商業實現,你可以用高效的XML的.NET版本,並使用標準的API .NET直接從C#代碼調用它。您可以從http://www.agiledelta.com/efx_download.html下載免費試用版本。

2

文件大小不是EXI(或任何二進制方案)的唯一優勢。處理時間和內存開銷在讀取/寫入時也大大降低。想象一下,通過簡單複製字節將浮點數複製到磁盤的程序。現在想象另一個程序將浮點數轉換爲格式化文本,並將它們粘貼到文本流中,然後通過昂貴的壓縮算法提供該流。由於這種荒謬的開銷,對於可以用二進制表示輕鬆處理的非常大的文件而言,XML基本上不可用。

二進制XML有望解決XML這一長期存在的弱點。在二進制/文本表示之間進行轉換(不知道XML模式)是非常容易的,這意味着您仍然可以在需要時輕鬆編輯這些文件。

1

如果您正在尋找儘可能小的尺寸,然後嘗試的Fast Infoset二進制XML編碼,然後通過壓縮BZIP2和LZMA。您可能會獲得比壓縮文本XML或使用EXI更好的結果。 FastInfoset.NET包括快速信息集標準的實現和幾種可供選擇的壓縮格式,但它是商業的。