PDA

View Full Version : سوال: برای افزایش سرعت این برنامه چه کار کنم؟



mehrab1387
یک شنبه 11 دی 1390, 11:20 صبح
من یه برنامه برای محاسبه تعداد تکرار کلمات یا در واقع الگوریتم TF_IDF نوشتم.
در واقع من 9 تا category دارم و هر کدام از انها شامل 1000 تا فایل متنی دارد یعنی در مجموع 9000 فایل متنی دارم که آنها را به پایگاه داده منتقل کرده ا م.حالا برنامه باید برای هر کلمه در این 9000 سند یکبار تعداد سند های که شامل کلمه مورد نظر است را پیدا کرده و نیز تعداد سند های آن category که کلمه در سند آن است.اما برنامه ای که من نوشتم وقت زیادی می برد .دوستان کد برنامه را در زیر قرار دادم.
به نظر شما چه کار کنم تا سرعت برنامه بالا رود.
لطفا اگر نظری دارید روی کد اعمال کنید.
ممنون




int Id = 1, Idc = 1;
double Score = 0.0;
privatevoid button1_Click(object sender, EventArgs e)
{
for (Id = 15; Id <= 1000; Id++)
{
string[] all_Words = Restore_Text(Id, Idc);
foreach (string items in all_Words)
{
if (items.Contains("."))
continue;
if (Is_Exist(items,Idc))
continue;
Score = score(items);
insert_TF_IDF(Id, Idc, items, Score);
}
}
}
publicstring[] Restore_Text(int Id, int Idc)
{
string str_query = "select txt from Table_IG_Text where Id =" + Id + "and Idc =" + Idc + " ";
Connect obj = newConnect();
DataTable dt = obj.MySelect(str_query);
if (dt.Rows.Count > 0)
{
string[] all_Words = dt.Rows[0]["txt"].ToString().Split(' ');
return all_Words;
}
else
{
string[] all_Words = { "0" };
return all_Words;
}
}
publicbool Is_Exist(string items,int Idc)
{
string str_query = "select Word from Table_TF_IDF where Word like '" + items + "' and Idc= " + Idc + " ";
Connect obj = newConnect();
DataTable dt = obj.MySelect(str_query);
if (dt.Rows.Count > 0)
{
returntrue;
}
returnfalse;
}
publicdouble count_Word_Category(string word, int category)
{
string str_query = "select count(Id) from Table_IG_Text where txt like '% " + word + " %' and Idc =" + category + " ";
Connect obj = newConnect();
DataTable dt = obj.MySelect(str_query);
returnInt32.Parse(dt.Rows[0][0].ToString());
}
publicdouble count_Word(string word)
{
string str_query = "select count(Id) from Table_IG_Text where txt like '% " + word + " %' ";
Connect obj = newConnect();
DataTable dt = obj.MySelect(str_query);
returnInt32.Parse(dt.Rows[0][0].ToString());
}
publicdouble score(string items)
{
double count_word_category = count_Word_Category(items, Idc);
double count_word = count_Word(items);
return count_word_category * Math.Log10((9000.0 / count_word));
}
publicvoid insert_TF_IDF(int Id, int Idc, string word, double score)
{
string str_query = "insert into Table_TF_IDF values('" + Id + "','" + Idc + "','" + word + "','" + score + "')";
Connect obj = newConnect();
obj.insert(str_query);
} 
}

mehrab1387
یک شنبه 11 دی 1390, 11:31 صبح
با عرض پوزش .
این هم کد

mehrab1387
یک شنبه 11 دی 1390, 18:58 عصر
دوستان هیچ کس نیست کمک کنه؟

amir_alaki
دوشنبه 12 دی 1390, 00:31 صبح
با سلام
دوست عزیز فکر کنم که اگر از thread کمک بگیری و برنامه رو یک جوری دسته بندی کنی که مثلا هر thread یک دسته از کلمات رو بگرده شاید برنامه سریعتر بشه ، و یک پیشنهاد دیگه اینکه اگر اطلاعات شما در بانک اطلاعاتی وچود دارند از امکانات SQl Server استفاده کنین.
موفق یاشید

zarrinnegar
دوشنبه 12 دی 1390, 00:48 صبح
من پیشنهاد میکنم مثل مایکروسافت عمل کنی
بطور ساده وقتی شما محتویات داخل computer را با تایپ یک کلمه که ممکن است نام فایل باشد یا کلمه ای درون محتوی یک فایل جستجو میکنید، برای بار اول طول میکشد تا فایلهایی را که حاوی کلمه است پیدا کند ولی پس از پیدا کردن آن ، گزینه ای دارد که آیا این کلمه را داخل ایندکس جستجو قرار دهد یا خیر

در واقع این کلمات را داخل یک فایل ایندکس با محتویات پیدا شده قرار میدهد تا در مراجعه دوم به بعد با سرعت بیشتری اطلاعات را نمایش دهد

پیشنهاد من این است که یک جدول شامل نام کلمه و جدول دیگری که child این جدول است بسازی و با هر بار جستجو اول داخل جدول اول را بگردی و اگر نبود سراغ جستجوی کلی بری و بعد از جستجو مشخصات کلمه و دیتیل آن که در کدام فایل است را ذخیره کنی
پس از اون میتونی با سرعت بالا کلمات مورد جستجوی تکراری رو خیلی سریع پیدا کنی

نمیدونم تونستم مطلب رو برسونم یا نه

mehrab1387
دوشنبه 12 دی 1390, 14:59 عصر
ممنون
ولی من باید روی تمام کلمات داخل فایل ها جستجو بزنم و تعداد سند هایی که این کلمه را دارند بشمارم نه فقط کلمات تکراری