繁体   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