منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب
حل مشكلة التهنيج عند قراءة بيانات ضخمة من مصفوفة - نسخة قابلة للطباعة

+- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb)
+-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182)
+--- قسم : قسم مقالات VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=184)
+--- الموضوع : حل مشكلة التهنيج عند قراءة بيانات ضخمة من مصفوفة (/showthread.php?tid=22257)

الصفحات: 1 2


حل مشكلة التهنيج عند قراءة بيانات ضخمة من مصفوفة - silverlight - 26-10-17

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



الفكرة يمكن تطويرها لقراءة بيانات من ملف ضخم
تقبلوا تحياتي


RE: حل مشكلة التهنيج عند قراءة بيانات ضخمة من مصفوفة - قناص المدينة - 26-10-17

شكرأ اخي العزيز ولكن هناك دالة في sql تمكنك من تقسيم البيانات في قاعدة البيانات وهي Row_Number


RE: حل مشكلة التهنيج عند قراءة بيانات ضخمة من مصفوفة - silverlight - 26-10-17

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


RE: حل مشكلة التهنيج عند قراءة بيانات ضخمة من مصفوفة - قناص المدينة - 26-10-17

هذه الدالة تقسم الصفوف بدلا من استخدام 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

هذا هي الدالة


RE: حل مشكلة التهنيج عند قراءة بيانات ضخمة من مصفوفة - sendbad100 - 26-10-17

صحيح اخي silverlight

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

الان تاكدت اكثر انها مجديه بعد موضوعك هذا
شكرا لك


RE: حل مشكلة التهنيج عند قراءة بيانات ضخمة من مصفوفة - silverlight - 26-10-17

الأخ قناص المدينة
بالرغم اني مش بافهم في الداتبيز
لكن حين رأيت الكود الخاص بك
فهمت ماذا تقصد
انت هنا تقرا البيانات من 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
ثم لاحظ ماذا سيحدث معك

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

الأخ السندباد
كلامك مظبوط طبعا .......


RE: حل مشكلة التهنيج عند قراءة بيانات ضخمة من مصفوفة - قناص المدينة - 27-10-17

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


RE: حل مشكلة التهنيج عند قراءة بيانات ضخمة من مصفوفة - silverlight - 27-10-17

الأخ قناص المدينة

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


RE: حل مشكلة التهنيج عند قراءة بيانات ضخمة من مصفوفة - silverlight - 27-10-17

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

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


RE: حل مشكلة التهنيج عند قراءة بيانات ضخمة من مصفوفة - نبيل فتحى - 29-10-17

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

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

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