В настоящее время я пытаюсь загрузить в общей сложности 30 000 файлов varbinary с SQL Server на свой локальный диск. Я использую Entity Framework, чтобы установить соединение для загрузки этих файлов в консольное приложение .NET. Что выглядит следующим образом.
static void Main(string[] args)
{
using (DatabaseContext db = new DatabaseContext())
{
var files = from t in db.StandardExpenceFiles
select t;
foreach (StandardExpenceFiles t in files)
{
if (t.MimeType != null && t.FileName != null && t.FileContent != null)
{
if (t.StandardExpenseShortDescription.Contains("/ "))
{
t.StandardExpenseShortDescription = t.StandardExpenseShortDescription.Replace("/ ", string.Empty);
}
string ext = t.MimeType.Substring(t.MimeType.LastIndexOf('/') + 1);
try
{
if (!File.Exists("path"))
{
using (FileStream fs = File.Create("path"))
{
fs.Write(t.FileContent, 0, t.FileContent.Length);
fs.Close();
}
}
}
catch (Exception ex)
{
throw ex;
}
}
}
}
}
Он работает, но через некоторое время вылетает из-за неправильной утилизации памяти. как видно на скриншоте. Это вызывает задержку, которая приводит к тайм-ауту sqlclient.
Я новичок в Entity Framework и не знаю, как использовать его чисто. Ищу способ исправить тот или иной способ загрузки моих файлов с помощью Entity Framework.
Этот Что-то вроде выглядит как исключение, которое может создать фреймворк, но на самом деле это не так. Это текст точный или вы перефразируете? Пожалуйста, скопируйте точный текст и указание, в какой строке он находится, если таковой имеется.
Цикл foreach - это строка, которая вызывает исключение.
почему вы явно удаляете файловый поток перед выходом из foreach? Кроме того, почему там пустой блок finally? Кроме того, ловушка с помощью только WriteLine поглощает все ошибки, если вы не отслеживаете окно вывода, вам, безусловно, следует повторно генерировать исключения или обрабатывать их в противном случае.
Я изменил вопрос, чтобы прояснить проблему
Все файлы прикрепляются к контексту. Попробуйте db.StandardExpenceFiles.AsNoTracking().
Все тот же результат @GertArnold
Ладно ... Не понимаю, потому что память съедают груды байтовых массивов, то есть все эти FileContent. Вы действительно утилизируете FileStream, поэтому кажется, что не осталось ничего, что могло бы избежать утилизации мусора. Что, если вы попробуете File.WriteAllBytes вместо создания и утилизации FileStream? (Что в любом случае проще).





Я удалил тег sql server, поскольку он не имеет ничего общего с sql server.