تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
حل مشكلة التهنيج عند قراءة بيانات ضخمة من مصفوفة
#1
واحدة من المشاكل التي تقابل المبرمج هي قراءة بيانات من مصفوفة ذات حجم كبير
هذه المشكلة غالبا يعاني منها مبرمجي الداتا بيز خاصة عندم يتضخم الملف و يمتلأ بالبيانات و يتحول الأمر الي معاناة ويؤدي ذلك الي بطء في اظهار البيانات علي الشاشة
غالبا الحلول تكمن في استخدام thread مثل Backgroundworker او شئ مماثل

اغلب Thread تعتمد علي تايمر و الفكرة التالية توضح كيف تملأ ListtBox بإستخدام تايمر بدلا من استخدام thread
دون أن يؤثر ذلك علي كفاءة البرنامج أو يؤدي الي تهنيج

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


افتح مشروع ........
اضف للفورم ليست بوكس
أضف تايمر

واكتب الكود بالشكل التالي


PHP كود :
Public Class Form1

    Private x 
As Integer 0
    Private values 
As String() = Nothing

    Private Sub Form1_Load
(sender As ObjectAs EventArgsHandles MyBase.Load
        values 
= New String() {"1""2""3""4""5""6""7""8""9""10""11""12""13""14""15""16""17""18""19""20"}
 
       Timer1.Start()
 
   End Sub

    Private Sub FillListBox
()
 
       Me.Timer1.Interval 1000
        Dim s 
As String values(Me.x Mod values.Length)
 
       x += 1
        ListBox1
.Items.Add(s)
 
       If x values.Length Then
            Timer1
.Stop()
 
       End If
 
   End Sub

    Private Sub Timer1_Tick
(sender As ObjectAs EventArgsHandles Timer1.Tick
        FillListBox
()
 
   End Sub

End 
Class 

المثال التالي يوضح كيف تقرأ البيانات و تملأ البيانات في نفس الوقت
الفكرة مثل Synchronize
لتنفيذ الفكرة
افتح مشروع
اضف عدد 2 تايمر
اضف ليست بوكس للفورم
واكتب الكود بالشكل التالي
أهم شئ في الموضوع أن التايمر الذي يقرأ يجب أن يكون أسرع من التايمر الذي يملأ الليست بوكس


PHP كود :
Public Class Form1

    Private x 
As Integer 0
    Private y 
As Integer 0
    Private values 
As Integer() = Nothing

    Private Sub Form1_Load
(sender As ObjectAs EventArgsHandles MyBase.Load
        values 
= New Integer(1000) {}

 
       Timer2.Start()
 
       Threading.Thread.Sleep(100)
 
       Timer1.Start()

 
   End Sub

    Private Sub FillListBox
()
 
       Me.Timer1.Interval 1000
        Dim s 
As Integer values(Me.x Mod values.Length)
 
       x += 1
        ListBox1
.Items.Add(s.ToString)
 
       If x values.Length Then
            Timer1
.Stop()
 
       End If
 
   End Sub

    Private Sub Timer1_Tick
(sender As ObjectAs EventArgsHandles Timer1.Tick
        FillListBox
()
 
   End Sub

    Private Sub ReadData
()
 
       values(y) = y
        y 
+= 1
        If y 
values.Length Then
            Timer2
.Stop()
 
       End If
 
   End Sub

    Private Sub Timer2_Tick
(sender As ObjectAs EventArgsHandles Timer2.Tick
        ReadData
()
 
   End Sub
End 
Class 



الفكرة يمكن تطويرها لقراءة بيانات من ملف ضخم
تقبلوا تحياتي
Retired
الرد }}}
تم الشكر بواسطة: Sajad , ابو ليلى
#2
شكرأ اخي العزيز ولكن هناك دالة في sql تمكنك من تقسيم البيانات في قاعدة البيانات وهي Row_Number
الرد }}}
تم الشكر بواسطة:
#3
الأخ قناص المدينة
الحقيقة أن مش فاهم حضرتك بتتكلم عن ايه
عموما لو عندك وقت اعمل لنا مثال لكي يقرأ ملف به 200 مليون عنصر مثلا و ارفعه في المنتدي لكي نتعلم من حضرتك و يستفيد الجميع
Retired
الرد }}}
تم الشكر بواسطة:
#4
هذه الدالة تقسم الصفوف بدلا من استخدام top ويمكن الاستفادة من
https://www.youtube.com/results?search_query=ROW_NUMBER

SELECT * FROM (
select row_number() OVER (order by createtime desc) AS ROWINDEX,*
from TABLENAME ) TB
WHERE TB.ROWINDEX between 0 and 10

هذا هي الدالة
الرد }}}
تم الشكر بواسطة:
#5
صحيح اخي silverlight

في فجوال بيسك6 استخدم التايمر بدل الثيرد وماشيه امورها تمام

الان تاكدت اكثر انها مجديه بعد موضوعك هذا
شكرا لك
الرد }}}
تم الشكر بواسطة:
#6
الأخ قناص المدينة
بالرغم اني مش بافهم في الداتبيز
لكن حين رأيت الكود الخاص بك
فهمت ماذا تقصد
انت هنا تقرا البيانات من index معين حتي index أخر و هذا ما تقصده أنت بالتقسيم
ما فعلته يمكن عمله بالمصفوفات ايضا او باستخدام LINQ بسهولة

عمومانا فكرتي تختلف عن الكود الخاص بك تماما فهدفي من الموضوع هو توضيح ان المبرمج لا يحتاج الي استخدام Threading بل يمكنه ان يبني Thread الخاص به
خاصة عند تعبئة البيانات الضخمة من ملف الي الكونترول مثل الليست بوكس كما في المثال

الأن و لتوضيح الأمر كثر لنفترض انك لديك مصفوفة بها 200 مليون سجل
كيف تملأ البيانات في الليست بوكس بطريقة لا تجعل البرنامج الخاص بك يهنج
هذا هو الهدف من الموضوع

أما طريقة التقسيم فأنا استخدمها مع البيانات الأكثر ضخامة بحيث يتم تقسيم المصفوفة الي مصفوفات صغيرة ذات حجم معين أحدده أنا
لأنه احيانا القراءة مباشرة قد تؤدي بك الي System out of memory exception

في المثال التالي قمت بقراءة 200 مليون رقم و بدأت أملأ بها الليست بوكس

PHP كود :
Public Class Form1

    Private x 
As Integer 0
    Private y 
As Integer 0
    Private values 
As Integer() = Nothing

    Private Sub Form1_Load
(sender As ObjectAs EventArgsHandles MyBase.Load
        values 
= New Integer(200000000) {}
 
       Timer2.Interval 10
        Timer2
.Start()
 
       Threading.Thread.Sleep(100)
 
       Timer1.Interval 20
        Timer1
.Start()

 
   End Sub

    Private Sub FillListBox
()
 
       Dim s As Integer values(Me.x Mod values.Length)
 
       x += 1
        ListBox1
.Items.Add(s.ToString)
 
       If x values.Length Then
            Timer1
.Stop()
 
       End If
 
   End Sub

    Private Sub Timer1_Tick
(sender As ObjectAs EventArgsHandles Timer1.Tick
        FillListBox
()
 
   End Sub

    Private Sub ReadData
()
 
       values(y) = y
        y 
+= 1
        If y 
values.Length Then
            Timer2
.Stop()
 
       End If
 
   End Sub

    Private Sub Timer2_Tick
(sender As ObjectAs EventArgsHandles Timer2.Tick
        ReadData
()
 
   End Sub
End 
Class 

حاول تغثر القيمة 200 مليون الي مثلا Integet.MaxValue -1
ثم لاحظ ماذا سيحدث معك

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

الأخ السندباد
كلامك مظبوط طبعا .......
Retired
الرد }}}
تم الشكر بواسطة:
#7
https://www.youtube.com/watch?v=vFH5fBSW3II
لتوضيح اكثير يمكن مشاهدة هذا
ولكم خالص الشكر
الرد }}}
تم الشكر بواسطة:
#8
الأخ قناص المدينة

من فضلك بلاش لينكات اليوتيوب
ولما تحب ترد ياريت تريد بكود مكتوب و ليس برابط فيديو في موقع علي النت
حاول تثبت وجهة نظرك بكتابة الكود لو سمحت
Retired
الرد }}}
تم الشكر بواسطة:
#9
الكود بالمرفقات الهدف منه توضيح الفكرة
انا استخدمت 2 تايمر
أحدهما مصمم لكي يعمل في الخلفية ويتم استخدامه لقراءة البيانات
و الأخر تايمر عادي يتم استخدامه لتعبئة البيانات

الكود بنسخة الفيجوا استوديو 2015


الملفات المرفقة
.rar   Test_TimerCallback.rar (الحجم : 65.88 ك ب / التحميلات : 106)
Retired
الرد }}}
تم الشكر بواسطة: نبيل فتحى
#10
(27-10-17, 11:07 AM)silverlight كتب : الكود بالمرفقات الهدف منه توضيح الفكرة
انا استخدمت 2 تايمر
أحدهما مصمم لكي يعمل في الخلفية ويتم استخدامه لقراءة البيانات
و الأخر تايمر عادي يتم استخدامه لتعبئة البيانات

الكود بنسخة الفيجوا استوديو 2015

طب ممكن مثال للداتا جريد فيو قرائه اسرع من العرض
الرد }}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [مشروع] حل مشكلة الترقيم التلقائي بعد حذف سجل معين mohammed alnour 9 13,797 13-01-23, 04:16 PM
آخر رد: اسلام الكبابى
Video [درس فيديو] حل مشكلة تغيير مسار قاعدة البيانات مع تقارير كريستال ريبورت رمضان272 0 1,680 23-04-22, 05:56 AM
آخر رد: رمضان272
  [شرح] اتصال بقاعدة بيانات اكسيس , اضافة بيان , تعديل بيان , حذف بيان , عرض البيانات . ahmed salam 25 38,227 23-02-22, 06:04 PM
آخر رد: رضوان الجماعي
  قراءة رقم من ضمن سلسلة ارقام موجودة في الحقل عبدالكريم برشدان 2 1,565 06-11-21, 11:20 PM
آخر رد: عبدالكريم برشدان
  [نقاش] [لم تحل] لدي مشكلة وارجو الحل ! aabbccdd 2 2,516 05-04-21, 07:49 PM
آخر رد: aabbccdd
  دمج قاعدة بيانات SQL Server 2008 مع المشروع بالـ VBNET snipercoder 4 8,199 12-11-20, 06:01 PM
آخر رد: lion4
  [درس فيديو] كيف تحول اي قاعدة بيانات اكسس الى SQL aljzazy 3 3,291 17-04-20, 09:27 PM
آخر رد: الوايلي
  [درس فيديو] كيف تحول اي قاعدة بيانات اكسس الى mysql aljzazy 0 2,314 10-04-20, 09:05 PM
آخر رد: aljzazy
  [VB.NET] كيفية استخدام اداوات ديف اكسبريس devexpressلادخال السجلات الى قاعدة بيانات نوع اكسس 13adam123 0 2,579 29-03-20, 12:50 PM
آخر رد: 13adam123
  كيفية عمل برنامج للأذان + قاعدة بيانات لـ 252 دولة و 9512 مدينة ! : مبرمج أوتار 4 23,517 21-01-19, 03:43 PM
آخر رد: elgokr

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم