PDA

View Full Version : مشكل با كم اوردن حافظه رم



ebrahimv
شنبه 09 مهر 1390, 21:55 عصر
من در حال نوشتن برنامه اي هستم كه فايل در پايگاه داده ذخيره ميكنه و استخراج ميكنه
همه چي درسته ولي بعد از مدتي كار با برنامه كم كم حافظه رم كم مياد و خطا ميده
حالا دنبال راهي هستم كه حافظه رم رو خالي كنم يعني فظاي بيخودي رو كه برنامم برداشته برگردونه

يه چيز جالبي هم كه هست وقتي دستور رو داخل try قرار ميدم و خطا ميده همون موقع حافظه آزاد ميشه و دوباره اگه بزنم درست كار ميكنه

مرتضی تقدمی
شنبه 09 مهر 1390, 22:27 عصر
سلام
خطای overflow هستش؟

ebrahimv
یک شنبه 10 مهر 1390, 06:44 صبح
اين خطا رو ميده

Alirezanet
یک شنبه 10 مهر 1390, 19:57 عصر
سلام
احتمالا دارید شما از MemoryStream استفاده میکنید برای نگه داشتن عکس ها و یا ذخیره کردن اونها و .....
پیشنهاد من اینه از ّFileStream استفاده کنید تا فضای اشغال شده از هارد استفاده کنه تا رم کم نیارید .
موفق باشید

ebrahimv
یک شنبه 10 مهر 1390, 21:35 عصر
سلام
احتمالا دارید شما از MemoryStream استفاده میکنید برای نگه داشتن عکس ها و یا ذخیره کردن اونها و .....
پیشنهاد من اینه از ّFileStream استفاده کنید تا فضای اشغال شده از هارد استفاده کنه تا رم کم نیارید .
موفق باشید

من از اين دستور استفاده ميكنم


My.Computer.FileSystem.WriteAllBytes(filePath, SqlCom.ExecuteScalar(), True)

من مثلا يه فايل رو ذخيره ميكنم بعد كه اين عمل تموم شد به حافظه مصرفي برنامم دقت مي‌كنم ميبينم كه حافظه رو ول نكرده بعد چند بار تكار اين كارم رم پر شده و خطا ميده و جالبه همون لحظه رم آزاد ميشه
اين مشكل كلا هست ولي تو اين برنامه كه حجم اطلاعات زياد هست بيشتر به چشم مي‌خوره يعني وقتي كاري رو انجام ميدي و تموم ميشه حافظه ازاد نميشه من بيشتر دنبال پيدا كردن رفع همين مشكلم

Hossis
یک شنبه 10 مهر 1390, 21:56 عصر
احتمالا مشکل از این است که شما در هر بار اجرای این کد،‌ یک sqlcommand جدید با کلمه New تعریف می کنید. این روند باعث می شود که هر بار،‌یک متغیر جدید با حجم بالا ایجاد شده و در حافظه بماند و کم کم تعداد آنها زیاد شود و بدیهی است وقتی برنامه با خطا مواجه شد،‌این متغیر ها از بین رفته و حافظه یک باره خالی می شود
بر این اساس شما باید در قسمت عمومی پروژه یک متغیر (مثلا sqlcmd ) به صورت عمومی تعریف کنید تا با هر باراجرای کد،‌مقدار قبلی حذف شده و مقدار جدی جایگزین شود.
علاوه بر این که بعد از ذخیره مقادر در فایل‌، می توانید مقدار آن را حذف کنید.
sqlcmd.dispose
امیدوارم مشکلتون حل بشه

ebrahimv
یک شنبه 10 مهر 1390, 22:07 عصر
احتمالا مشکل از این است که شما در هر بار اجرای این کد،‌ یک sqlcommand جدید با کلمه New تعریف می کنید. این روند باعث می شود که هر بار،‌یک متغیر جدید با حجم بالا ایجاد شده و در حافظه بماند و کم کم تعداد آنها زیاد شود و بدیهی است وقتی برنامه با خطا مواجه شد،‌این متغیر ها از بین رفته و حافظه یک باره خالی می شود
بر این اساس شما باید در قسمت عمومی پروژه یک متغیر (مثلا sqlcmd ) به صورت عمومی تعریف کنید تا با هر باراجرای کد،‌مقدار قبلی حذف شده و مقدار جدی جایگزین شود.
علاوه بر این که بعد از ذخیره مقادر در فایل‌، می توانید مقدار آن را حذف کنید.
sqlcmd.dispose
امیدوارم مشکلتون حل بشه

به صورت عمومي هست و dispose هم امتحان كردم ولي نشد

Hossis
یک شنبه 10 مهر 1390, 22:50 عصر
متاسفم
باید تمام کد رو درج کنید تا دوستان تشخیص بدن عیب از کجاست؟

ebrahimv
یک شنبه 10 مهر 1390, 22:55 عصر
SqlCom.CommandText = "SELECT Files FROM tblShahrsazeFile WHERE (Id = @Id)"
SqlCom.Parameters.Clear()
SqlCom.Parameters.AddWithValue("@Id", Id)
SqlCon.Close()
SqlCon.Open()
Try
Me.Cursor = Cursors.WaitCursor
My.Computer.FileSystem.WriteAllBytes(filePath, SqlCom.ExecuteScalar(), True)
SqlCom.Dispose()
Me.Cursor = Cursors.Default
Catch ex As Exception
Me.Cursor = Cursors.Default
SabtError(ex.Message)
Exit Sub
End Try