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

كيف أستطيع البحث في الملفات النصية من غير تحميلها في الذاكرة؟

مغلق
بدأه sscvbnm في 4 فبراير 2008 · 9 رد · 1,185 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

أربد طريقة عملية للتعامل مع الملفات النصية (البحث فيها، قراءة جزء منها، تقسيمها حسب..) كبيرة الحجم يضل حجم الواحد مها إلى 100 ميجا أو أكثر.

طباً المشكلة أنني لما أحمل الملف على الذاكرةبالطريقة العادية للتعامل مع نصه يأخذ وقت طويل ويسبب مشاكل في البرنامج والنظام لأنه يستهلك الذاكرة!

قرأت عدد من المواضع عن هذا الموضوع في الأقسام c++ ودلفي وvb6 وapi كلها تتحدث عن: Memory-Mapped Files

لكن هل يوجد طريقة مطورة في الدوت نت تحل هذه المشكلة؟

وإن كان لا فكيف أبحث في الملف النصي باستخدام Memory-Mapped Files

هل من شرح تفصيلي لهذا الموضوع وجزاكم الله خيراً

قال صلى الله عليه وسلم: من قال إذا أصبح: رضيت بالله ربا وبالإسلام دينا وبمحمد نبيا فأنا الزعيم لآخذن بيده حتى أدخله الجنة. الصحيحة/2686

#2

أنا لم أجرب التعامل مع ملفات بهذا الحجم لكن جرب أن تبحث عن أو تحاكي الـ Buffering وأخبرنا بالنتائج ,,,

#3

لقد صنعت برنامج خاص لتقسيم الملفات ويستطيع البرنامج أن يقسم ملفات يصل حجمها إلى 900 جيغابايت وإليك الطريقة الأسهل للتخفيف عن الذاكرة برأيي أنا والتي يمكن أن تفيدك :

- أحجز متحول من نوع long قيمته الإبتدائية 1 يعبر عن موقع القراءة الحالي .

- أحجز متحول من نوع string وليكن حجمه 1024*1024 وهو ما يساوي ميغا بايت .

- الآنم تقوم بقراءة الملف ميغا ميغا بالتسلسل وتقوم بالعمليات المطلوبة على الميغا الحالية المخزنة في المتحول من نوع string .

- وكل ما قرأت ميغا وأنتهيت من معالجتها تزيد المتحول الذي من نوع long بمقدار 1024*1024 وتخزن في المتحول من نوع string الميغا التالية ( التي تبدأ من المتحول الذي من نوع long ) .

- وتابع حتى ينتهي الملف وذلك عن طريق حلقة تفحص أن الملف أنتهى أو لا.

ملاحظة : الطريقة المثلى للتعامل مع الملفات بهذه الطريقة ( أي قراءة حجم معين بدءاً من مكان معين ) هي الطريقة الثنائية أي Binary عدا أنها لا تؤذي الملفات الثنائية كالتنفيذية .

#4

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

جزاكم الله خيراً على الردود :)

استخدمت طريقة ال buffer لقراءة الملف الكبير بشكل متقطع حسب الأسطر أو حسب عدد من الحروف من خلال هذا الكود والذي يليه:

		Dim bufferLen As Integer = 1002
		'''''''قراءة
		Dim fs As IO.FileStream = New IO.FileStream("c:\1.txt", IO.FileMode.Open, IO.FileAccess.Read)
		Dim br As IO.BinaryReader = New IO.BinaryReader(fs)
		Dim buffer() As Char = br.ReadChars(bufferLen)
		'======
		Do While buffer.Length > 0
		Dim STR As String = ""
		STR = Convert.ToString(buffer)
 ''''''هنا نقوم بتنفيذ العمليات المطلوبة على النص		
 'TextBox1.Text = STR

		Array.Clear(buffer, 0, buffer.Length)
		buffer = br.ReadChars(bufferLen)
		My.Application.DoEvents()
		Loop
		br.Close()
		fs.Close()
		'===========================

وهذا الكود الثاني:

		Dim u As IO.TextReader = New IO.StreamReader("c:\1.txt", System.Text.Encoding.UTF8)
		Dim buffer(1000) As Char
		u.ReadBlock(buffer, 1, 1000)
		TextBox1.Text = Convert.ToString(buffer)
		My.Application.DoEvents()
		u.Close()

وبالمناسبة واجهت مشكلة في هذا الكود الثاني حيث أنني بعدما قمت بتعبئة الbuffer من خلال ReadBlock يتم فعلاً تعبئة الBuffer لكنه لا يتحول إلى نص ولا يظهر شيء في مربع النص! :( أرجو المساعدة في هذا..

ولكن يبقى السؤال مطروح: كيف سأقوم بالبحث ضمن ملف نصي حجمه كبير لا يمكن تحميله كاملاً إلى الذاكرة وإرجاع index الكلمة المبحوث عنها في هذا الملف حتى أستطيع استخدام ReadBlock مثلاً لإرجاع جزء من نص النتيجة؟ هل هذا ممكن أرجو المساعدة؟؟ :wacko:

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

تم تعديل هذه المشاركة بواسطة sscvbnm في 6 فبراير 2008 في 17:38

قال صلى الله عليه وسلم: من قال إذا أصبح: رضيت بالله ربا وبالإسلام دينا وبمحمد نبيا فأنا الزعيم لآخذن بيده حتى أدخله الجنة. الصحيحة/2686

#6

شكراً لك أخ hazzoom

ولكن هذه الطريقة ستعطي نتيجة البحث بسرعة الfor أو do وهذه الأوامر بطيئة جداً نسبياً لو وازنها مع الأوامر الجاهزة للتعامل مع الstring ولا أدري ما السبب!

شكراً لك على أية حال، واللي يعرف فكرة أخرى يتفحنا بها جزاكم الله خيراً..

قال صلى الله عليه وسلم: من قال إذا أصبح: رضيت بالله ربا وبالإسلام دينا وبمحمد نبيا فأنا الزعيم لآخذن بيده حتى أدخله الجنة. الصحيحة/2686

#7

سؤال آخر يتبادر إلى ذهني لعلكم تساعدونني للوصول إلى الإجابة..

أليست قاعدة البيانات في النهاية ملف نصي أو باينري؟ كيف يقوم المخدم بالبحث فيها؟ ما هي آلية ذلك؟ هل من شرح لهذا الموضوع؟! :blink:

قال صلى الله عليه وسلم: من قال إذا أصبح: رضيت بالله ربا وبالإسلام دينا وبمحمد نبيا فأنا الزعيم لآخذن بيده حتى أدخله الجنة. الصحيحة/2686

#9

أقترح عليك أن تحمل جزء من الملف وتبحث في وإذا لم تجد فالجزء الذي بعده

مثلا

حجم الملف 100 ميجا

قسمه إلى 20 جزء أي تحمل إلى الذاكره 5 ميجا فقط وتبحث فيه وهكذا

#10

جزاكم الله خيراً جميعاً.. أفكار معقولة، لكن أتوقع أن بحثي سيتحول إلى كيفية برمجة سيرفر قواعد بيانات.

شكراً لكم جميعاً..

والسلام عليكم

قال صلى الله عليه وسلم: من قال إذا أصبح: رضيت بالله ربا وبالإسلام دينا وبمحمد نبيا فأنا الزعيم لآخذن بيده حتى أدخله الجنة. الصحيحة/2686

هذا الموضوع مغلق.

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…