簡體   English   中英

.NET壓縮XML以存儲在SQL Server數據庫中

[英].NET compression of XML to store in SQL Server database

目前,我們的.NET應用程序在內存中構建XML數據,並將其保存到SQL Server數據庫中。 使用ToString()將XElement對象轉換為字符串,然后將其存儲在DB中的varchar(MAX)列中。 我們不想使用SQL XML數據類型,因為我們不需要任何驗證,SQL不需要在任何階段查詢XML。

盡管此實現工作正常,但我們希望通過在存儲之前壓縮XML並在檢索之后對其進行解壓縮來減小數據庫的大小。 有沒有人有任何壓縮XElement對象的示例代碼(解壓縮也會很棒)? 此外,我需要對數據庫列的數據類型進行哪些更改,以便我們可以充分利用此壓縮?

我再次調查了SQL Server 2005提供的XML數據類型,它提供的驗證開銷太高,我們無法考慮使用它。 此外,雖然它確實壓縮了XML,但它沒有.NET DeflateStream類那么多的壓縮。

我已經通過將我們使用的XML寫入磁盤來測試DeflateStream類,然后將comrpessed版本保存為新文件。 結果很棒,一個16kb的文件下降到一個3kb的文件,所以這就是讓它在內存中工作並將結果數據保存到數據庫的情況。 有沒有人有任何示例代碼來進行壓縮,我應該將varcahr(MAX)colum更改為type to varbinary?

提前致謝

本文可以幫助您開始。

以下代碼段可以壓縮字符串並返回base-64編碼結果:

public static string Compress(string text)
{
 byte[] buffer = Encoding.UTF8.GetBytes(text);
 MemoryStream ms = new MemoryStream();
 using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))
 {
  zip.Write(buffer, 0, buffer.Length);
 }

 ms.Position = 0;
 MemoryStream outStream = new MemoryStream();

 byte[] compressed = new byte[ms.Length];
 ms.Read(compressed, 0, compressed.Length);

 byte[] gzBuffer = new byte[compressed.Length + 4];
 System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
 System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
 return Convert.ToBase64String (gzBuffer);
}

編輯:另外,即使將XML作為文本存儲,您也可能希望使用CLOB格式,因為varchars的長度非常有限 - XML通常很快就會超出。

我認為你還應該重新測試XML列。 它以二進制形式存儲,我知道,不是文本。 即使您實際上不需要其他功能,它也可能更小,並且可能表現不佳。

除了可能壓縮字符串本身(可能使用上面的LBushkin的Base64方法),你可能想要開始確保你殺死所有的空格。 默認的XElement.ToString()方法使用“indenting”保存元素。 如果要確保獲得標記和數據,則需要使用ToString(SaveOptions選項)方法(使用SaveOptions.DisableFormatting)。

我知道你標記了SQL 2005的問題,但你應該考慮升級到SQL 2008並使用它附帶的精彩的新壓縮功能 是開箱即用的,對您的應用程序透明,並將為您節省大量的實施/測試/支持成本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM