Как указано в комментарии OP, поле xml является обязательным.Тогда, как сказал D T
, вы должны хранить его в отдельной таблице.Далее вы можете добавить это поле после COMPRESSING
в C#
.Я даю некоторые статистические данные, которые я протестировал, используя BLToolKit
, а также EntityFramework
.
Я читаю текстовый файл с 70000
строками, и каждая строка содержит 70
символов.Это 5,039,998
длины.Ниже приведена статистика, которой я хочу поделиться.Я только что протестировал 35 записей без сжатия, для каждой строки в базе данных требовалось около 9MB
.
![enter image description here](https://i.stack.imgur.com/bJr21.png)
Как видите,OutOfMemory Exception
, я не копался в этом.Я просто хотел увидеть время.Что я на самом деле сделал, так это
Когда вы вставляете данные в эту таблицу;перед вставкой COMPRESS
строки.Тип данных для поля varbinary (MAX)
, я взял.Когда вы выбираете данные;извлекайте его только тогда, когда вы хотите обработать его.И не забудьте DECOMPRESS
.В SQL Server
для извлечения сжатых записей требуется 0 seconds
.
Ниже приведен код для сжатия и распаковки. Справочник по коду
public static void CopyTo(Stream src, Stream dest)
{
byte[] bytes = new byte[4096];
int cnt;
while ((cnt = src.Read(bytes, 0, bytes.Length)) != 0)
{
dest.Write(bytes, 0, cnt);
}
}
public static byte[] Zip(string str)
{
var bytes = Encoding.UTF8.GetBytes(str);
using (var msi = new MemoryStream(bytes))
using (var mso = new MemoryStream())
{
using (var gs = new GZipStream(mso, CompressionMode.Compress))
{
//msi.CopyTo(gs);
CopyTo(msi, gs);
}
return mso.ToArray();
}
}
public static string Unzip(byte[] bytes)
{
using (var msi = new MemoryStream(bytes))
using (var mso = new MemoryStream())
{
using (var gs = new GZipStream(msi, CompressionMode.Decompress))
{
//gs.CopyTo(mso);
CopyTo(gs, mso);
}
return Encoding.UTF8.GetString(mso.ToArray());
}
}
Надеюсь, что вам это поможет.