منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : حل مشكلة التهنيج عند قراءة بيانات ضخمة من مصفوفة
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2
واحدة من المشاكل التي تقابل المبرمج هي قراءة بيانات من مصفوفة ذات حجم كبير
هذه المشكلة غالبا يعاني منها مبرمجي الداتا بيز خاصة عندم يتضخم الملف و يمتلأ بالبيانات و يتحول الأمر الي معاناة ويؤدي ذلك الي بطء في اظهار البيانات علي الشاشة
غالبا الحلول تكمن في استخدام 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 



الفكرة يمكن تطويرها لقراءة بيانات من ملف ضخم
تقبلوا تحياتي
شكرأ اخي العزيز ولكن هناك دالة في sql تمكنك من تقسيم البيانات في قاعدة البيانات وهي Row_Number
الأخ قناص المدينة
الحقيقة أن مش فاهم حضرتك بتتكلم عن ايه
عموما لو عندك وقت اعمل لنا مثال لكي يقرأ ملف به 200 مليون عنصر مثلا و ارفعه في المنتدي لكي نتعلم من حضرتك و يستفيد الجميع
هذه الدالة تقسم الصفوف بدلا من استخدام 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

هذا هي الدالة
صحيح اخي silverlight

في فجوال بيسك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
ثم لاحظ ماذا سيحدث معك

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

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

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

الكود بنسخة الفيجوا استوديو 2015
(27-10-17, 11:07 AM)silverlight كتب : [ -> ]الكود بالمرفقات الهدف منه توضيح الفكرة
انا استخدمت 2 تايمر
أحدهما مصمم لكي يعمل في الخلفية ويتم استخدامه لقراءة البيانات
و الأخر تايمر عادي يتم استخدامه لتعبئة البيانات

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

طب ممكن مثال للداتا جريد فيو قرائه اسرع من العرض
الصفحات : 1 2