PDA

View Full Version : این خطا برای چیه ؟



brida_kh
یک شنبه 27 خرداد 1386, 09:47 صبح
با سلام.
از دوستان کسی تاحالا با این خطا برخورد کرده.
میشه بگید این ارور مال چیه؟

Exception of type System.OutOfMemoryException was thrown.

__H2__
یک شنبه 27 خرداد 1386, 10:19 صبح
سلام
احتمالاً درخواستی برای ساخت شی ای داده اید که حافظه زیادی میگیرد و سیستم بهه اندازه آن RAM خالی ندارد!
کارهای بزرگتان را به بلوک های کوچک تر بشکنید.

brida_kh
یک شنبه 27 خرداد 1386, 10:43 صبح
شی بزرگ مثلا چی؟تو این برنامه بزرگترین چیز کانکشنه که اونم پول شده
چیز دیگه ای به نظرتون میرسه؟

Behrouz_Rad
یک شنبه 27 خرداد 1386, 13:52 عصر
چه زمانی با این خطا برخورد می کنی؟

اگر کد خاصی باعث بروز این خطا میشه، با حذف تدریجی کدها میتونی به علت دقیق بروز مشکل پی ببری..

__H2__
یک شنبه 27 خرداد 1386, 14:07 عصر
سلام
من هم تکرار میکنم! چه زمانی با این خطا برخورد می کنید؟ در کدام خط؟ (برنامه را Debug کنید.)

اگر با بانک اطلاعاتی کار میکنید، تقریباً اطمینان دارم که اقدام به بارگذاری یک DataSet با تعداد خیلی زیادی سطر را کرده اید، منابع سرور که به یک کاربر سایت شما اختصاص می یابد معمولاً خیلی کمتر از رایانه شخصی است، در این حال برنامه در رایانه شخصی مشکلی ندارد ولی وقتی به سرور میرود به خطا میخورد!

به فرض آنکه حدسم در مورد پر کردن DataSet درست باشد، پیشنهاد میکنم:
تعداد سطرهای لود شده را کاهش دهید، مثلاً نه از نظر وجحه کاربرپسندی و نه از جهت اصول نرم افزاری درست نیست که شما که در یک زمان 3000 سطر اطلاعات را به کاربر نشان دهید!
صفحه بندی کنید و در هر صفحه حداکثر 100 قلم را نشان دهید.

brida_kh
سه شنبه 29 خرداد 1386, 12:05 عصر
دوست عزیزم.اصلا دیتا ستی وجود نداره،و شاید 100 سطر هم بایند نمیشه.موردی دیگه ای رو احتمال نمیدید؟

__H2__
سه شنبه 29 خرداد 1386, 16:55 عصر
سلام
اینطوری نمیشود! باید قسمتی از کد را که باعث این مشکل میشود، اینجا بگذارید!
بحرحال خطا، خطای سرریز RAM است و کدهای شما در مصرف RAM صرفه جویی نمیکنند!!

brida_kh
شنبه 02 تیر 1386, 15:27 عصر
public string showOther(int id,string NewsID)
{
string retStr = "";
DataTable dt = new DataTable();
string com = "SELECT top 4 * FROM News WHERE active=1 and (sDay <= DATEDIFF(hh, '2007-03-21', GETDATE())) and catID="+id.ToString()+"and NewsID<>'"+NewsID.ToString()+"'"+"ORDER BY catPriority DESC";
(new SqlDataAdapter(com,db.sqlCon)).Fill(dt);
for(int i=0;i<dt.Rows.Count;i++)
{
retStr += "<a class=Link3 href=viewNews.aspx?ID="+dt.Rows[i]["NewsID"].ToString()+"&cat="+id.ToString()+">";
retStr += dt.Rows[i]["NewsTitle"].ToString();
retStr += "</a><br>";
}
db.disconect();
return retStr;
}



این کد داخل صفحه هست
فکر نمیکنم اینقدر حافظه رو اشغال کنه که همچین ارروری بده.:ناراحت:

__H2__
شنبه 02 تیر 1386, 16:46 عصر
سلام
کمی وقت دهید با دقت بیشتری بررسی کنم، ولی یک سوال کوچک نوع فیلد NewsID و NewsTitle چیست؟ (String یا Integer) میتواند Null باشد یا نه؟؟
فیلد NewsTitle چه طور؟

ضمناً دستورات SQL تان کمی آشفته است و به نظر در بعضی جاها مشکل دارد، شاید هم در اینجا آمده این طوری شده؟؟!

و یک پیشنهاد، شما در کد فوق نیازی به datatable ندارید!! خودتانت مستقیاً از dataReader بخوانید، برای کد شما هم خیلی آسان تر و روانتر است و هم فوق العاده پر سرعت و هم به مقدار بسیار ناچیزی از RAM استفاده میکند، یعنی از هر لحاظ مرقون به صرفه است.

ضمناً شاید دیگر امروز نتوانم بیام این ور نت!!!

__H2__
شنبه 02 تیر 1386, 17:07 عصر
سلام
چون PM زده بودید، گفتم همین امروز یه کاریش کنم!!!
مثلاً کدهای زیر را تست کنید و ببینید جواب میدهد (هنوز به دانستن نوع فیلدها نیاز دارم)



public static string showOther(int id, string NewsID)
{
string retStr = "";
using (System.Data.SqlClient.SqlConnection dbCon = new System.Data.SqlClient.SqlConnection("ConnectionString"))
{
using (System.Data.SqlClient.SqlCommand dbCom = new System.Data.SqlClient.SqlCommand("SELECT TOP 4 * FROM [News] WHERE ([active]=1 AND [catID]= @catID AND NewsID<>@NewsID) ORDER BY [catPriority] DESC", dbCon))
{
dbCom.Parameters.AddWithValue("@catID", id);
dbCom.Parameters.AddWithValue("@NewsID", NewsID);

dbCon.Open();
using (System.Data.SqlClient.SqlDataReader dbDr = dbCom.ExecuteReader())
{
int iOrdinal_NewsID = dbDr.GetOrdinal("NewsID");
int iOrdinal_NewsTitle = dbDr.GetOrdinal("NewsTitle");
string strID = id.ToString();

while (dbDr.Read)
{
retStr +=
"<a class=Link3 href='viewNews.aspx?ID=" + dbDr.GetString(iOrdinal_NewsID) + "&cat=" + strID + "'>" +
dbDr.GetString(iOrdinal_NewsTitle) +
"</a><br/>";
}
}
}
}
}


البته به علت کمی وقت سریع نوشتم، امیدوارم اشتباه تابلویی نداشته باشد!
لطفاً تست کنید و جواب دهید. (علاوه بر جواب نوع فیلدها)
اما در کل کدی شبیه این بسیار سریعتر اجرا میشود، فوق العاده سریع و با مصرف خیلی کم حافظه.

(گرچه به نظر میرسد مشکل کد شما از RAM نبوده!)

موفق و پیروز باشید.

azmoodeh
شنبه 02 تیر 1386, 17:12 عصر
اگر کد دوستمون جواب نداد به جای String از کلاس StringBuilder استفاده کنید ببینید درست میشه ؟

brida_kh
یک شنبه 03 تیر 1386, 07:55 صبح
فیلد newsID از نوع integer هست و بقیه nvarchar و اجازه خالی درج شدن هم ندارند.

__H2__
یک شنبه 03 تیر 1386, 09:48 صبح
سلام

فیلد newsID از نوع integer هست و بقیه nvarchar و اجازه خالی درج شدن هم ندارند.
مطمئن هستید برعکس نگفتید؟؟؟؟ دقت کنید!
اتفاقاً در برنامه کاملاً برعکس است، فیلد newsID یک string است و catID عددی است!!! :متعجب:

اگر اینطور باشد، ایراد از نوع نادرست داده های شماست.



اگر کد دوستمون جواب نداد به جای String از کلاس StringBuilder استفاده کنید ببینید درست میشه ؟
مشکل ایشان که از RAM نیست ولی تقریباً اطمینان دارم، از نظر سرعت و مصرف RAM نوع داده های String بسیار بهتر است، این یکی از انواع اصلی متغییرها در دات نت است و بدون شک بهینه سازی های خوبی روی آن انجام شده :لبخند:

brida_kh
یک شنبه 03 تیر 1386, 12:26 عصر
دوست عزیز این داده ها با همان نوعی که گفتم در دیتا بیس ذخیره شدند اما موقع select تبدیل به String کردم.ممکنه این موضوع مشکل ساز بشه؟

__H2__
یک شنبه 03 تیر 1386, 12:44 عصر
سلام
پس لطفاً این دستورات را تست کنید! و ببینید کار میکند یا نه؟؟؟؟؟؟؟


public static string showOther(int id, string NewsID)
{
string retStr = "";
string strID = id.ToString();

using (System.Data.SqlClient.SqlConnection dbCon = new System.Data.SqlClient.SqlConnection("ConnectionString"))
{
System.Data.SqlClient.SqlCommand dbCom = new System.Data.SqlClient.SqlCommand("SELECT TOP 4 * FROM [News] WHERE ([active]=1 AND [catID]= @catID AND NewsID<>@NewsID) ORDER BY [catPriority] DESC", dbCon);

dbCom.Parameters.AddWithValue("@catID", strID);
dbCom.Parameters.AddWithValue("@NewsID", System.Convert.ToInt32(NewsID));

dbCon.Open();
using (System.Data.SqlClient.SqlDataReader dbDr = dbCom.ExecuteReader())
{
int iOrdinal_NewsID = dbDr.GetOrdinal("NewsID");
int iOrdinal_NewsTitle = dbDr.GetOrdinal("NewsTitle");
while (dbDr.Read())
{
retStr +=
"<a class='Link3' href='viewNews.aspx?ID=" + dbDr.GetInt32(iOrdinal_NewsID).ToString() + "&cat=" + strID + "'>" +
dbDr.GetString(iOrdinal_NewsTitle) +
"</a><br/>";
}
}
}
return retStr;
}


به تغغیرات نسبت به قبل هم دقت کنید، شما باید نوع داده ها را در زمان پرکردن پارامترها و خواندن لحاظ کنید،
ضمناً خیلی بهتر است اگر بتواند ورودی فایل را هم همگام با نوع ها قرار دهید مثلاً


public static string showOther(string id, int NewsID)


منتظر نتیجه تست شما هستم.
موفق باشید.

azmoodeh
یک شنبه 03 تیر 1386, 19:15 عصر
سلام

مطمئن هستید برعکس نگفتید؟؟؟؟ دقت کنید!
اتفاقاً در برنامه کاملاً برعکس است، فیلد newsID یک string است و catID عددی است!!! :متعجب:

اگر اینطور باشد، ایراد از نوع نادرست داده های شماست.



مشکل ایشان که از RAM نیست ولی تقریباً اطمینان دارم، از نظر سرعت و مصرف RAM نوع داده های String بسیار بهتر است، این یکی از انواع اصلی متغییرها در دات نت است و بدون شک بهینه سازی های خوبی روی آن انجام شده :لبخند:

دوست عزیز ، توابع موجود در StringBuilder برای کار با حجم رشته ای زیاد طراحی شدند ، تا حالا فکر کردید اگر String بهتر بود پس چرا دیگه StringBuilder استفاده می شه ؟!؟؟! این کلاس به همین منظور که عرض کردم طراحی شده


این هم یه لینک از سایت مایکروسافت در این مورد

http://msdn2.microsoft.com/en-us/library/system.text.stringbuilder.aspx


البته این همه موضوع رو به StringBuilder مربوط نکنیم.من هم گفتم ممکنه از این باشه ، چون Performance کلاس StringBuilder بیشتر هست

موفق باشید

brida_kh
دوشنبه 04 تیر 1386, 08:29 صبح
یه مسئله دیگه ای هم هست.
همین برنامه روی یه سرور دیگه 6 ماهه داره درست کار میکنه.من فقط میخواستم یه بک آپ دیگه هم داشته باشم که اینطور شد