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

قراءة الملفات باستخدام تعدد الخيوط

بدأه علاء الصالحي في 7 مارس 2012 · 6 رد · 651 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

في اعتقادكم ما هي أفضل طريقة لقراءة الملفات النصية

(الملفات التي تفصلها \n)

باستخدام الخيوط؟

عن نفسي أفضل حل وجدته كان

هو أسلوب producer consumer

هل هناك طرق أسرع؟

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#2

و عليكم السلام أخى علاء ....

لماذا طريقة خاصه؟

ألا تكفى ال Buffered Streams التى تقدمها الجافا؟

و ماذا تقصد ب طريقة Producer-Consumer ؟ هل تقصد أكتب ثم توقف و دع الخيط الأخر يقرأ حتى ينتهى من القراءه ثم يتوقف ثم أكتب و هكذا؟

و إن كنت تقصد هذا ... كيف تؤثر هذه الطريقة في السرعه؟

بالمناسبة هل جربت NIO؟

#3

لا المشكلة لدي هي أريد البحث في ملفات ما

لو قرأت باستخدام Buffer فهذا يعني أني لا أستطيع أن أبحث في نفس الملف بأكثر من خيط

لهذا فأنا أفكر في خيط واحد ينتج ويضع الناتج في مستودع

وخيوط تقوم بالاستهلاك أو في حالتنا بالبحث

لم أستخدم NIO من قبل

هل من أفكار في الموضوع؟

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#4

حيا الله الشباب ,,

نعم Single Producer & Multi-Consumer تصميم جيد وسيكون هناك Utilization للموراد بشكل أفضل,, أيضاً من ناحية مقروئية الكود ووضوحه خصوصاً أنه سيفصل مسألة الإنتاج من مسألة الاستهلاك،، باستخدم java.util.concurreny سوف يكون الأمر أسهل وقابل للإدارة بعكس الLow Level Thread,,

هذه الأيام أقوم بنفس الوظيفة حيث أقوم بعمل Traversal على القرص لغرض الIndexing (لغرض البحث في الحقيقة حيث سيسهل الأندكس عملية البحث وسوف يكون سريع جداً )،، يمكنك وضع هذا الخيار اذا كانت عمليات البحث سوف تتم بصورة كثيرة ، فلا يمكن الانتظار مثلاُ 10 دقايق في كل عملية بحث,,

الProducer سوف يكتب ما يجده مباشره في Blocking Queue والConsumers سوف تقرأ منه ، تبقى المسئلة هي في تحديد هل الQueue ذو حد معين أم Unbounded Queue ,, أيضاً عدد الخانات فيه ،، وعدد الConsumers في الPool سوف يؤثر في أداء العملية,,

بالنسبة للقرائه الملفات فقد يكون هناك فرق طفيف بين كل طريقة وأخرى Buffered/NIO/Stream وان كان بعد تصميم الDesign يمكن أن تتضح أماكن التحسين اذا وجدت الحاجة,,

بالتوفيق،،

2

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#5
Wajdy Essam كتب:

حيا الله الشباب ,,

نعم Single Producer & Multi-Consumer تصميم جيد وسيكون هناك Utilization للموراد بشكل أفضل,, أيضاً من ناحية مقروئية الكود ووضوحه خصوصاً أنه سيفصل مسألة الإنتاج من مسألة الاستهلاك،، باستخدم java.util.concurreny سوف يكون الأمر أسهل وقابل للإدارة بعكس الLow Level Thread,,

هذه الأيام أقوم بنفس الوظيفة حيث أقوم بعمل Traversal على القرص لغرض الIndexing (لغرض البحث في الحقيقة حيث سيسهل الأندكس عملية البحث وسوف يكون سريع جداً )،، يمكنك وضع هذا الخيار اذا كانت عمليات البحث سوف تتم بصورة كثيرة ، فلا يمكن الانتظار مثلاُ 10 دقايق في كل عملية بحث,,

الProducer سوف يكتب ما يجده مباشره في Blocking Queue والConsumers سوف تقرأ منه ، تبقى المسئلة هي في تحديد هل الQueue ذو حد معين أم Unbounded Queue ,, أيضاً عدد الخانات فيه ،، وعدد الConsumers في الPool سوف يؤثر في أداء العملية,,

بالنسبة للقرائه الملفات فقد يكون هناك فرق طفيف بين كل طريقة وأخرى Buffered/NIO/Stream وان كان بعد تصميم الDesign يمكن أن تتضح أماكن التحسين اذا وجدت الحاجة,,

بالتوفيق،،

هل من توضيح أكثر مع مثال؟

إذا نظــرتَ نيـوب اللـّيـثِ بـارزةً         فـلا تظــنَنَ أَنَّ اللـّيـــثَ يبْتسـِـــمُ


 


 


رسم المخططات البيانية بواسطة الجافا


 


كتاب تحليل وتصميم نظم المعلومات


#6

إنظر لل Javadoc الخاصه لل BlockingQueue و منه هذا المثال:

class Producer implements Runnable {
   private final BlockingQueue queue;
   Producer(BlockingQueue q) { queue = q; }
   public void run() {
     try {
       while (true) { queue.put(produce()); }
     } catch (InterruptedException ex) { ... handle ...}
   }
   Object produce() { ... }
 }

 class Consumer implements Runnable {
   private final BlockingQueue queue;
   Consumer(BlockingQueue q) { queue = q; }
   public void run() {
     try {
       while (true) { consume(queue.take()); }
     } catch (InterruptedException ex) { ... handle ...}
   }
   void consume(Object x) { ... }
 }

 class Setup {
   void main() {
     BlockingQueue q = new SomeQueueImplementation();
     Producer p = new Producer(q);
     Consumer c1 = new Consumer(q);
     Consumer c2 = new Consumer(q);
     new Thread(p).start();
     new Thread(c1).start();
     new Thread(c2).start();
   }
 }
#7

في حالتك أخي وجدي تستطيع بناء أكثر من producer لأنه لديك أكثر من ملف

لكن في حالتي وهي ملف واحد فأنا ملزم بواحد فقط

لكم جزيل الشكر يا شباب على مشاركتكم

أخي vector_ever

هذه مقالة قديمة كتبتها عن wait notify

لمحة جافاوية 25: المساجين الخيوط والسجانين الكائنات

فيها مثال عن consumer producer اطلع عليها وأخبرني لو أشكل عليك شيء ما

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

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