الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تسريع البحث في قاعدة البيانات

بدأه ayash في 1 مارس 2011 · 17 رد · 1,534 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحم الرحيم

السلام عليكم ورحمة الله وبركاته

اخواني في المنتدى

بس حابب اشرح فكرة البرنامج لكي يكون السؤال واضح ايش المطلوب منه

-----------------------------------------------------

الفكرة كالتالي

اعمل برنامج مقارنة SIGNATURE بالملفات في الجهاز

يوجد عندي قاعدة بيانات بADO.NET تحتوي على signiture

حيث عمية المقارن تتم كالتالي :-

يقوم الشخص تحديد المسار الذي يريد البحث فيه ثم يقوم البرنامج بالبحث في جميع الملفات التي في هذا المسار

يمر على كل ملف ويقوم بقرائة الملف وتحويله الي hex وثم يخزنه فيstring

ويقوم باستخدام regular expression في عملية مقارنة الstring بالsigniture

كالتالي :-

string Select_MinId = "select min(id) from table";
        string Select_MaxId = "select max(id) from table";
 for (int i = get_data_base.getId(Select_MinId); i <= get_data_base.getId(Select_MaxId); i++)
            {
    signature = get_data_base.get_Signature(i); //get the signiture from database
      Boolean check_match = Regex.IsMatch(StrFile, signature, RegexOptions.IgnoreCase);

}
حيث StrFile الملف بعد تحويله الى hex
signiture -->هي regular الذي اريد مقارنته 
وحيث ال  et_data_base.getId لاسترجاع الid من الdatabase

----------------------------------------------------------

السؤال هو:-عندما زاد عدد الsigniture في الdb قلة سرعة البحث كثيرا جدا صار بطيئ

كيف اقدر اسرع البحث

هل يوجد طريقه افضل او ما هو الحل للتسريع عملية البحث

وشكرا

تم تعديل هذه المشاركة بواسطة ayash في 1 مارس 2011 في 15:09

291964_260506123967115_206850989332629_1001538_45132_n.jpg

اللهم إني أعوذ بك من علم لا ينفع ، ومن قلب لا يخشع ، ومن نفس لا تشبع ، ومن دعوة لا يستجاب لها

#2

حفظ تواقيع الملفات في قاعدة بيانات, أنا معك, لكن تنفيد استعلامات خلال عمليات البحث, أنا لست معك.

#3

لماذا عملية البحث عن طريق الـregex وليس عن طريق قاعدة البيانات؟

1
#4

مشكورين اخواني على المرور

-------------------------------------------------

اقتباس
حفظ تواقيع الملفات في قاعدة بيانات, أنا معك, لكن تنفيد استعلامات خلال عمليات البحث, أنا لست معك.

طيب اخي ايش الحل بالنسبة لعمية البحث

اقتباس
لماذا عملية البحث عن طريق الـregex وليس عن طريق قاعدة البيانات؟

لان التواقيع معمولة بالregulae expression

كالتالي 01b9....8135....4747e2.*f8c3

بس كيف حل مشكلة البطء

وشكرا

تم تعديل هذه المشاركة بواسطة ayash في 1 مارس 2011 في 18:42

291964_260506123967115_206850989332629_1001538_45132_n.jpg

اللهم إني أعوذ بك من علم لا ينفع ، ومن قلب لا يخشع ، ومن نفس لا تشبع ، ومن دعوة لا يستجاب لها

#5

السلام عليكم و رحمة الله و بركاته

قم بتجربة هذا الكود و لاحظ الفرق


string Select_MaxId = "select max(id) from table";
int MinNo =get_data_base.getId(Select_MinId);
int MaxNo = get_data_base.getId(Select_MaxId);
for (int i = MinNo; i <= MaxNo; i++)
{
signature = get_data_base.get_Signature(i); //get the signiture from database
Boolean check_match = Regex.IsMatch(StrFile, signature, RegexOptions.IgnoreCase);

}
حيث StrFile الملف بعد تحويله الى hex
signiture -->هي regular الذي اريد مقارنته
وحيث ال et_data_base.getId لاسترجاع الid من الdatabase
string Select_MinId = "select min(id) from table";

تقبل خالص تحياتي

#6

مشكور اخي على المساعدة

لكن بقي بطيئ كالسابق

291964_260506123967115_206850989332629_1001538_45132_n.jpg

اللهم إني أعوذ بك من علم لا ينفع ، ومن قلب لا يخشع ، ومن نفس لا تشبع ، ومن دعوة لا يستجاب لها

#7

عنق الزجاجة هنا هو عملية الـregex نفسها وليست عملية قاعدة البيانات. لذا قد يكون من الأحرى البحث عن طريقة أخرى بديلة؟

#8
اقتباس
عنق الزجاجة هنا هو عملية الـregex نفسها وليست عملية قاعدة البيانات. لذا قد يكون من الأحرى البحث عن طريقة أخرى بديلة؟

تم تغيير من الregex الى الBoyerMoore

حيث تعد من اسرع الخورزميات البحث في النصوص ولكن لم يتغير بقي كما هو بطيء

تم تعديل هذه المشاركة بواسطة ayash في 3 مارس 2011 في 09:06

291964_260506123967115_206850989332629_1001538_45132_n.jpg

اللهم إني أعوذ بك من علم لا ينفع ، ومن قلب لا يخشع ، ومن نفس لا تشبع ، ومن دعوة لا يستجاب لها

#10
اقتباس

هل حاولت استخدام الـtext search في الـSQL Server؟

مشكور اخي على التواصل

لكن الذي اريد ان اعمله بالضبط هو مقارنة جميع التواقيع المجودة في قاعدة البيانات بالملف

ليس البحث في قاعدة البيانات وانما استخراج جميع التواقيع من قاعدة البيانات لمقارنت كل توقيع هل موجود بالملف او لا

وشكرا وغلبتك معي

هل يوجد طريقة سريعة

291964_260506123967115_206850989332629_1001538_45132_n.jpg

اللهم إني أعوذ بك من علم لا ينفع ، ومن قلب لا يخشع ، ومن نفس لا تشبع ، ومن دعوة لا يستجاب لها

#11

البرنامج في كل مرة يتم تشغيله يمر بترجمة لحضية من MSIL إلى لغة الالة، هذه هي لغة سي شارب (تأخير1).

ثم استخدامك لقاعدة بيانات مثل ADO.NET وبعدد ضخم من التواقيع (تأخير 2).

أي أن اختيارك لهذه اللغة+نضام قاعدة البيانات للقيام بشيء يشبه عملية المقارنة التي تقوم بها برامج مقاومات الفيروسات أمر غير منصوح به.

استخدم لغة برمجة Native ولا تقوم بـ Garbage collecting كالسي مثلا.

ملاحضة ابتعد عن SQL في مثل هذه البرامج لأداء أفضل.

تم تعديل هذه المشاركة بواسطة A.S Hack في 3 مارس 2011 في 20:51

" إن الله كتب الإحسان على كل شيء"

::

الإرادة ... تحقق السيادة.

#12
A.S Hack كتب:

البرنامج في كل مرة يتم تشغيله يمر بترجمة لحضية من MSIL إلى لغة الالة، هذه هي لغة سي شارب (تأخير1).

ثم استخدامك لقاعدة بيانات مثل ADO.NET وبعدد ضخم من التواقيع (تأخير 2).

أي أن اختيارك لهذه اللغة+نضام قاعدة البيانات للقيام بشيء يشبه عملية المقارنة التي تقوم بها برامج مقاومات الفيروسات أمر غير منصوح به.

استخدم لغة برمجة Native ولا تقوم بـ Garbage collecting كالسي مثلا.

ملاحضة ابتعد عن SQL في مثل هذه البرامج لأداء أفضل.

والله مشكلة اذا هيك

بس مشكلته هي لما زدت عدد التواقيع في قاعدة البيانات صار بطيئ

طيب اخي ايش استخدم بدل sql في c#

لاني محتاج سرعة استخراج التواقيع من قاعد البيانات

الله اخليكم

مشكورين على التواصل

تم تعديل هذه المشاركة بواسطة ayash في 3 مارس 2011 في 22:28

291964_260506123967115_206850989332629_1001538_45132_n.jpg

اللهم إني أعوذ بك من علم لا ينفع ، ومن قلب لا يخشع ، ومن نفس لا تشبع ، ومن دعوة لا يستجاب لها

#13

السلام عليكم

لماذا لا تحمل البيانات من القاعدة عند بدء تشغيل برنامجك و تخزنها في Array ثم تقوم بالبحث فيها بدل الاتصال بقاعدة البيانات كل مرة.

و إذا عدلت على قاعدة البيانات تعمل refresh للArray ثم تكمل عملك.

هذا ان لم تكن انت تعمل هكذا من الأول.

أتمنى أني أفدت.

#14

يسلمو اخي لكنني

جربتها وبقيت بطيئة

شكرا

291964_260506123967115_206850989332629_1001538_45132_n.jpg

اللهم إني أعوذ بك من علم لا ينفع ، ومن قلب لا يخشع ، ومن نفس لا تشبع ، ومن دعوة لا يستجاب لها

#15

أخي ayash يمكنك الاستغناء عن sql ... جرب هذا المشروع مجاني ومفتوح المصدر .. berkeley-db قاعدة بيانات قابلة للتضمين في برنامجك ...

اقتباس
Oracle Berkeley DB provides the best open source embeddable databases allowing developers the choice of SQL, Key/Value, XML/XQuery or Java Object storage for their data model

دونك الرابط

http://www.oracle.co...y-db/index.html

تم تعديل هذه المشاركة بواسطة A.S Hack في 18 مارس 2011 في 00:00

1

" إن الله كتب الإحسان على كل شيء"

::

الإرادة ... تحقق السيادة.

#16
اقتباس
أخي ayash يمكنك الاستغناء عن sql ... جرب هذا المشروع مجاني ومفتوح المصدر .. berkeley-db قاعدة بيانات قابلة للتضمين في برنامجك ...

مشكور اخي راح ابحث في الموضوع

بس سؤال لو وضعت التواقيع في ملف text هل يكون افضل من قاعدة البيانات

مش عارف صراحة بس ايش رايكم

----------------------------------------------------------------------

تم تعديل هذه المشاركة بواسطة ayash في 18 مارس 2011 في 23:58

291964_260506123967115_206850989332629_1001538_45132_n.jpg

اللهم إني أعوذ بك من علم لا ينفع ، ومن قلب لا يخشع ، ومن نفس لا تشبع ، ومن دعوة لا يستجاب لها

#17
ayash كتب:

مشكور اخي راح ابحث في الموضوع

بس سؤال لو وضعت التواقيع في ملف text هل يكون افضل من قاعدة البيانات

مش عارف صراحة بس ايش رايكم

----------------------------------------------------------------------

اذا قمت بهذه الطريقة واستخدمت استداعات I\O للوصول للبيانات في الملف، فسيزداد الأمر سوءا وبطأ،

أما لو قمت بتخطيط الملف على الذاكرة قبل القراءة منه (ابحث عن file memory-mapping in .NET 4 ) فربما ستصل لنتيجة أفضل، اممم لكن في حالة كانت البيانات كبيرة جدا، فأعتقد أنك ستحتاج لتقسيم مستويات للوصول للملف، وستحتاج لفرزها قبل القراءة (لتقيل الوصول المتردد للهاردسك والاعتماد على بيانات موجودة على الذاكرة فقط).

بالمناسبة كل هذا متوفر وجاهز في قاعدة بيانات Berkeley DB .. ابحث فيه عن موضوع in-memory cache وموضوع BTree & Hash access methods... ولا تنسى الاستفادة من الدالة IndexOf التي يقدمها اطار دوت نت في لغاته، ... طبعا انت حسبما قرأت تستخدم Boyer moore ، وهي خوارزمية شهيرة وسريعة لكن ربما الطريقة التي كتبتها لتحقيق هذه الخوارزمية ليست بتلك الكفاءة ... عندها جرب Indexof وقارن ... وبشرنا بالنتاءج.

1

" إن الله كتب الإحسان على كل شيء"

::

الإرادة ... تحقق السيادة.

#18
A.S Hack كتب:

اذا قمت بهذه الطريقة واستخدمت استداعات I\O للوصول للبيانات في الملف، فسيزداد الأمر سوءا وبطأ،

أما لو قمت بتخطيط الملف على الذاكرة قبل القراءة منه (ابحث عن file memory-mapping in .NET 4 ) فربما ستصل لنتيجة أفضل، اممم لكن في حالة كانت البيانات كبيرة جدا، فأعتقد أنك ستحتاج لتقسيم مستويات للوصول للملف، وستحتاج لفرزها قبل القراءة (لتقيل الوصول المتردد للهاردسك والاعتماد على بيانات موجودة على الذاكرة فقط).

بالمناسبة كل هذا متوفر وجاهز في قاعدة بيانات Berkeley DB .. ابحث فيه عن موضوع in-memory cache وموضوع BTree & Hash access methods... ولا تنسى الاستفادة من الدالة IndexOf التي يقدمها اطار دوت نت في لغاته، ... طبعا انت حسبما قرأت تستخدم Boyer moore ، وهي خوارزمية شهيرة وسريعة لكن ربما الطريقة التي كتبتها لتحقيق هذه الخوارزمية ليست بتلك الكفاءة ... عندها جرب Indexof وقارن ... وبشرنا بالنتاءج.

مشكور يا اخي وبارك الله فيك

تم تعديل هذه المشاركة بواسطة ayash في 9 أبريل 2011 في 16:08

291964_260506123967115_206850989332629_1001538_45132_n.jpg

اللهم إني أعوذ بك من علم لا ينفع ، ومن قلب لا يخشع ، ومن نفس لا تشبع ، ومن دعوة لا يستجاب لها

مواضيع مشابهة