Mdf файл становится слишком большим, вставляя двоичные данные
Я беру jpegs и вставляю их в таблицу в виде байтового массива в поле типа данных varbinary(MAX). Однако размер файла mdf увеличивается в три-четыре раза по сравнению с общим размером всех файлов, которые я вставляю. Я использую стандартную технику кодирования C#, чтобы взять веб-ответ и преобразовать его в поток памяти:
byte[] result;
byte[] buffer = new byte[4096];
using (Stream responseStream = request.GetResponse().GetResponseStream())
{
using (MemoryStream memoryStream = new MemoryStream())
{
int count = 0;
do
{
count = responseStream.Read(buffer, 0, buffer.Length);
memoryStream.Write(buffer, 0, count);
} while (count != 0);
result = memoryStream.ToArray();
}
}
И все же, как-то 512 Мб в формате JPEG заканчиваются тем, что увеличивают размер mdf до 2 Гб. Когда я делаю вставку в таблицу, я также определяю длину в этом поле, используя result.length. Автоматический рост установлен на 5%.
1 ответ
JPEG 512 МБ должен занимать чуть более 512 МБ в базе данных. Размер самого mdf может увеличиться, но это зависит от настроенного приращения базы данных. sp_spaceused
должен показывать использованное и свободное пространство.
Но способ обработки файла на самом деле довольно плох, используя поток памяти. Никогда не будет работать. Прочитайте Загрузка и выгрузка изображений с SQL Server через ASP.Net MVC для правильного способа потоковой передачи файлов из HTTP в базу данных. Вы должны использовать UPDATE blob.write
из-за ограничений размера памяти процесса приложения, а также из-за минимально зарегистрированных операций базы данных. Связанная статья объясняет более подробно, почему и как это сделать. Вы можете использовать ту же технику и для потоковой передачи в веб-ответе, без создания полной копии в памяти.