.NET сжатие XML для хранения в базе данных SQL Server

В настоящее время наше приложение .NET создает данные XML в памяти, которые мы сохраняем в базе данных SQL Server. Объект XElement преобразуется в строку с помощью ToString () и затем сохраняется в столбце varchar (MAX) в БД. Мы не хотим использовать тип данных SQL XML, так как нам не требуется никакой проверки, и SQL не требуется запрашивать XML на любом этапе.

Хотя эта реализация работает нормально, мы хотим уменьшить размер базы данных, сжимая XML перед его сохранением и распаковывая его после извлечения. Есть ли у кого-нибудь пример кода для сжатия объекта XElement (и распаковка тоже будет здорово)? Кроме того, какие изменения мне нужно внести в тип данных столбца базы данных, чтобы мы могли в полной мере воспользоваться этим сжатием?

Я снова исследовал тип данных XML, предлагаемый SQL Server 2005, и издержки проверки, которые он предлагает, слишком высоки, чтобы мы могли рассмотреть его использование. Кроме того, хотя он несколько сжимает XML, он не так сильно сжимает, как класс .NET DeflateStream.

Я протестировал класс DeflateStream, записав XML-файл, который мы используем, на диск, а затем сохранил собранную версию в виде нового файла. Результаты замечательные, файл размером 16 КБ сводится к файлу размером 3 КБ, поэтому есть случай, когда это работает в памяти и сохраняется результирующие данные в БД. У кого-нибудь есть какой-нибудь пример кода для сжатия, и я должен изменить столбец varcahr (MAX) на тип, возможно, на varbinary?

Заранее спасибо

4 голоса | спросил Robin Weston 7 J000000Tuesday09 2009, 00:49:30

4 ответа


0

Эта статья может помочь вам начать работу.

Следующий фрагмент может сжимать строку и возвращать результат в кодировке 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);
}

РЕДАКТИРОВАТЬ: Кроме того, вы можете использовать форматы CLOB даже при хранении XML в виде текста, потому что varchars имеют очень ограниченную длину, которую часто может превышать XML.

ответил LBushkin 7 J000000Tuesday09 2009, 00:53:46
0

Я думаю, вам также следует повторно протестировать столбец XML. Он хранится в двоичном формате, я знаю, а не в виде текста. Он может быть меньше и может не работать плохо, даже если вам не нужны дополнительные функции.

ответил John Saunders 7 J000000Tuesday09 2009, 01:01:13
0

Помимо возможного сжатия самой строки (возможно, с использованием метода BaseB LBushkin, описанного выше), вы, вероятно, захотите начать с того, чтобы убедиться, что вы удалили все пробелы. Метод XElement.ToString () по умолчанию сохраняет элемент с «отступом». Вам нужно использовать метод ToString (параметры SaveOptions) (используя SaveOptions.DisableFormatting), если вы хотите убедиться, что вы только что получили теги и данные.

ответил Jacob Proffitt 7 J000000Tuesday09 2009, 02:56:56
0

Я знаю, что вы пометили вопрос SQL 2005, но вам следует подумать об обновлении до SQL 2008 и использовании замечательного нового возможности сжатия , которые идут с ним. Готов к работе, прозрачен для вашего приложения и сэкономит вам огромные затраты на внедрение /тестирование /поддержку.

ответил Remus Rusanu 7 J000000Tuesday09 2009, 00:59:07

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132