PDA

View Full Version : سوال: پیغام out of memory هنگام خواندن فیلد عکس از بانک



armm1388
شنبه 30 فروردین 1399, 14:07 عصر
با سلام
در برنامه C#‎‎ از نوع winform با بانک اطلاعاتی sql server فیلدی در جدول از برای ذخیره تصاویر در نظر گرفته ام که هم درست ذخیره می کند و هم درست بازیابی می کند ولی اگر چند عکس را با هم بازیابی کنم که حجم زیادی هم ندارند حافظه Ram به شدت اشغال می شود و پیغام out of memory می دهد. دستورات File.Flush() و File.Dispose() و File.Close() هم فایده ای نداشتند. راهکار چیست؟



System.IO.FileStream File = new System.IO.FileStream("C:\\ TempFile\\" + PictureFileName_Field, System.IO.FileMode.Create, System.IO.FileAccess.Write);
byte[] bytFile = new byte[File.Length + 1];

bytFile = (byte[])(PictureFile_Field);
File.Write(bytFile, 0, bytFile.Length - 1);

File.Flush();
File.Dispose();
File.Close();


با تشکر

the king
شنبه 30 فروردین 1399, 14:41 عصر
با سلام
در برنامه C#‎‎‎‎‎‎‎‎‎ از نوع winform با بانک اطلاعاتی sql server فیلدی در جدول از برای ذخیره تصاویر در نظر گرفته ام که هم درست ذخیره می کند و هم درست بازیابی می کند ولی اگر چند عکس را با هم بازیابی کنم که حجم زیادی هم ندارند حافظه Ram به شدت اشغال می شود و پیغام out of memory می دهد. دستورات File.Flush() و File.Dispose() و File.Close() هم فایده ای نداشتند. راهکار چیست؟



System.IO.FileStream File = new System.IO.FileStream("C:\\ TempFile\\" + PictureFileName_Field, System.IO.FileMode.Create, System.IO.FileAccess.Write);
byte[] bytFile = new byte[File.Length + 1];

bytFile = (byte[])(PictureFile_Field);
File.Write(bytFile, 0, bytFile.Length - 1);

File.Flush();
File.Dispose();
File.Close();


با تشکر
اگر در یک سطر کد بنویسید x = one و در سطر بعد بنویسید x = two مقدار x به two تغییر می کنه و مقدار دهی در سطر قبلی بی اثر میشه، چون مقدار one رو دور میندازید.
دادن مقدار one به x بی فایده میشه چون نگهش نمیدارید.
شما در یک سطر برای bytFile یک آرایه ای از بایت ها رو ایجاد می کنید و در سطر بعدی اون آرایه رو میندازید دور و بجایش مقدار PictureFile_Field رو می دهید.
پس ایجاد اون آرایه و کد new byte[File.Length + 1] بیخودی بوده.
از طرف دیگه چون شما با FileMode.Create فایل جدید ایجاد می کنید، حجم فایل جدید همیشه 0 ئه و داده ای نداره که به اندازه اش آرایه ایجاد کنید.
همچنین اگه طول bytFile برابر bytFile.Length هست، چرا به اندازه bytFile.Length - 1 بایتش رو ذخیره می کنید؟ چرا یک بایت کمتر؟
و نهایتا چیزی که باید نگران حافظه اش باشید File ئه نیست، bytFile ئه. Flush هم در اینجا کمکی نمی کنه، Flush زمانی مفیده که بخواهید فورا داده ها از بافر روی دیسک ذخیره بشه.

using (var file = new System.IO.FileStream("C:\\TempFile" + PictureFileName_Field, System.IO.FileMode.Create, System.IO.FileAccess.Write))
{
var bytFile = (byte[])PictureFile_Field;
file.Write(bytFile, 0, bytFile.Length);
}
GC.Collect();
GC.WaitForPendingFinalizers();

البته می توانید کد جمع و جور تری بنویسید :

System.IO.File.WriteAllBytes("C:\\TempFile" + PictureFileName_Field, (byte[]) PictureFile_Field);
GC.Collect();
GC.WaitForPendingFinalizers();