আমি কীভাবে এই ফরচ কোডটি সমান্তরালে রূপান্তর করতে পারি?


180

আমি কিছুটা বিভ্রান্ত হয়ে পড়েছি Parallel.ForEach
কী Parallel.ForEachএবং এটি ঠিক কী করে?
দয়া করে কোনও এমএসডিএন লিঙ্কটি উল্লেখ করবেন না।

এখানে একটি সাধারণ উদাহরণ:

string[] lines = File.ReadAllLines(txtProxyListPath.Text);
List<string> list_lines = new List<string>(lines);

foreach (string line in list_lines)
{
    //My Stuff
}

আমি কীভাবে এই উদাহরণটি আবার লিখতে পারি Parallel.ForEach?


এটির উত্তর এখানে দেওয়া যেতে পারে stackoverflow.com/questions/3789998/…
উজ্জ্বল মানন্ধর

1
@ উজ্জ্বল মানান্ধার এটি Parallelক্লাসের মধ্যে পার্থক্য এবং পিআইএনএলকিউ ব্যবহারের বিষয়ে জিজ্ঞাসা করাতে আসলেই অন্যরকম ।
রিড কোপসি

18
অন্যরা উত্তর দিয়েছেন যে কীভাবে আপনি আবার লিখতে পারেন। তাহলে এটি কি করে? এটি সংগ্রহের প্রতিটি আইটেমের উপর যেমন একটি সাধারণের মতো "ক্রিয়া" করে foreach। পার্থক্যটি হল সমান্তরাল সংস্করণ একই সাথে অনেকগুলি "ক্রিয়া" করতে পারে। বেশিরভাগ ক্ষেত্রে (কম্পিউটারটি কী কোডটি চালাচ্ছে, এবং এটি কতটা ব্যস্ত, এবং অন্যান্য স্টাফের উপর নির্ভর করে) এটি দ্রুত হবে এবং এটিই সবচেয়ে গুরুত্বপূর্ণ সুবিধা। মনে রাখবেন যে আপনি যখন এটি সমান্তরালভাবে করেন, আপনি কী ক্রমে আইটেমগুলি প্রক্রিয়াজাত করতে পারবেন তা জানতে পারবেন না । একটি সাধারণ (সিরিয়াল) সহ foreach, আপনি গ্যারান্টিযুক্ত যা lines[0]প্রথমে আসে, তারপরে lines[1]এবং আরও অনেক কিছু।
জেপ্প স্টিগ নীলসন

1
@ জেপ্পস্টিগনিয়েলসন জিনিসগুলি সমান্তরাল করার ক্ষেত্রে উল্লেখযোগ্য ওভারহেড থাকায় এটি সর্বদা দ্রুত হবে না । এটি আপনি যে সংগ্রহটি পুনরাবৃত্তি করছেন তার আকার এবং এর মধ্যে ক্রিয়া নির্ভর করে। করণীয় সঠিক জিনিসটি আসলে প্যারালাল.ফোরএচ () ব্যবহার এবং ফোরচ () ব্যবহারের মধ্যে পার্থক্য পরিমাপ করা । অনেক সময় একটি সাধারণ ভবিষ্যদ্বাণী () দ্রুত হয়।
ডেভ ব্ল্যাক

3
নিবন্ধন করুন এক করতে হবে পরিমাপ তা অপেক্ষাকৃত দ্রুত বা ধীরগতির হয়, প্রতিটি ক্ষেত্রে। আমি কেবল সাধারণভাবে সমান্তরালতা বর্ণনা করার চেষ্টা করছিলাম।
জেপ্পে স্টিগ নীলসন

উত্তর:


126
string[] lines = File.ReadAllLines(txtProxyListPath.Text);
List<string> list_lines = new List<string>(lines);
Parallel.ForEach(list_lines, line =>
{
    //Your stuff
});

6
কেবল এটি চিহ্নিত করতে চেয়েছিলেন (ওপিটির জন্য আরও) যাতে কোনও বিভ্রান্ত ধারণা না ঘটে যে এটি কেবলমাত্র কাজ করে List<T>;)
রিড কোপসি

1
মনোযোগ এবং উত্তরের জন্য ধন্যবাদ। HASH তালিকা ব্যবহার করে সদৃশ আইটেমগুলি সরিয়ে দেওয়ার কারণে আমি আমার কোডগুলিতে <স্ট্রিং> ব্যবহার করেছি List নিয়মিত অ্যারে দিয়ে আমরা সহজেই ডুপ্লিকেটগুলি মুছতে পারি না :)।
সিলভারলাইট

119
আমি বিভ্রান্ত হয়ে পড়েছি যে এই উত্তরটি সঠিক উত্তর হিসাবে চিহ্নিত হয়েছে, যেহেতু মূল পোস্টের প্রশ্নের কোনও ব্যাখ্যা নেই কারণ "সমান্তরাল কী?
ফরওয়ার্ড প্রতিটি

6
@ ফোসব সমস্যাটি হ'ল প্রশ্নের শিরোনামটি সম্পূর্ণরূপে অর্থ পরিবর্তনের জন্য সম্পাদিত হয়েছিল ... সুতরাং এই উত্তরটির আর কোনও অর্থ হয় না। এটি বলার পরেও এটি এখনও একটি জবাব নয়
aw04

273

ফরচ লুপ:

  • একের পর এক ধারাবাহিকভাবে আইট্রেশন হয়
  • ফরচ লুপটি একক থ্রেড থেকে চালিত হয়।
  • Foreach লুপটি .NET এর প্রতিটি কাঠামোর মধ্যে সংজ্ঞায়িত করা হয়
  • এক্সিকিউশন ধীর প্রসেস হতে পারে ধীর হিসাবে তারা ধারাবাহিকভাবে চালানো করছি,
    • 1 শেষ না হওয়া পর্যন্ত প্রক্রিয়া 2 শুরু হতে পারে না। 2 এবং 1 শেষ না হওয়া পর্যন্ত প্রক্রিয়া 3 শুরু হতে পারে না ...
  • থ্রেডিং ওভারহেড না থাকায় দ্রুত প্রক্রিয়াগুলি কার্যকর করা দ্রুততর হতে পারে

Parallel.ForEach:

  • সমান্তরালভাবে কার্যকর করা হয়।
  • সমান্তরাল.ফরচ একাধিক থ্রেড ব্যবহার করে।
  • সমান্তরাল.ফরচ। নেট 4.0 এবং উপরের ফ্রেমওয়ার্কগুলিতে সংজ্ঞায়িত করা হয়েছে।
  • ধীরে ধীরে প্রক্রিয়াগুলি কার্যকর করা দ্রুত হতে পারে , কারণ এগুলি সমান্তরালে চালানো যেতে পারে
    • 1, 2, এবং 3 প্রক্রিয়াগুলি একই সাথে চলতে পারে (নীচে পুনরায় ব্যবহৃত থ্রেডগুলি দেখুন)
  • অতিরিক্ত থ্রেডিং ওভারহেডের কারণে দ্রুত প্রক্রিয়াগুলি কার্যকর করা ধীর হতে পারে

নিম্নলিখিত উদাহরণটি প্রথাগত ফোরচ লুপ এবং এর মধ্যে পার্থক্য পরিষ্কারভাবে দেখায়

সমান্তরাল। ForEach () উদাহরণ

using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
namespace ParallelForEachExample
{
    class Program
    {
        static void Main()
        {
            string[] colors = {
                                  "1. Red",
                                  "2. Green",
                                  "3. Blue",
                                  "4. Yellow",
                                  "5. White",
                                  "6. Black",
                                  "7. Violet",
                                  "8. Brown",
                                  "9. Orange",
                                  "10. Pink"
                              };
            Console.WriteLine("Traditional foreach loop\n");
            //start the stopwatch for "for" loop
            var sw = Stopwatch.StartNew();
            foreach (string color in colors)
            {
                Console.WriteLine("{0}, Thread Id= {1}", color, Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(10);
            }
            Console.WriteLine("foreach loop execution time = {0} seconds\n", sw.Elapsed.TotalSeconds);
            Console.WriteLine("Using Parallel.ForEach");
            //start the stopwatch for "Parallel.ForEach"
             sw = Stopwatch.StartNew();
            Parallel.ForEach(colors, color =>
            {
                Console.WriteLine("{0}, Thread Id= {1}", color, Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(10);
            }
            );
            Console.WriteLine("Parallel.ForEach() execution time = {0} seconds", sw.Elapsed.TotalSeconds);
            Console.Read();
        }
    }
}

আউটপুট

Traditional foreach loop
1. Red, Thread Id= 10
2. Green, Thread Id= 10
3. Blue, Thread Id= 10
4. Yellow, Thread Id= 10
5. White, Thread Id= 10
6. Black, Thread Id= 10
7. Violet, Thread Id= 10
8. Brown, Thread Id= 10
9. Orange, Thread Id= 10
10. Pink, Thread Id= 10
foreach loop execution time = 0.1054376 seconds

সমান্তরাল ব্যবহার করে প্রতিটি উদাহরণ

1. Red, Thread Id= 10
3. Blue, Thread Id= 11
4. Yellow, Thread Id= 11
2. Green, Thread Id= 10
5. White, Thread Id= 12
7. Violet, Thread Id= 14
9. Orange, Thread Id= 13
6. Black, Thread Id= 11
8. Brown, Thread Id= 10
10. Pink, Thread Id= 12
Parallel.ForEach() execution time = 0.055976 seconds

62
আমি আপনার 'দাবী' এর সাথে সত্যই একমত নই যে সমান্তরাল For ফরেক্স প্রতিটি (সর্বদা) দ্রুত। এটি লুপের অভ্যন্তরে অপারেশনের ভারীতার উপর নির্ভর করে। এটি প্যারালেলিজম প্রবর্তনের ওভারহেডের পক্ষে মূল্যবান হতে পারে বা নাও পারে।
মারতাও

1
ওয়েল, প্রতিটি সমান্তরাল মানে লুপের বডিগুলিতে কোড চালানোর জন্য পৃথক থ্রেড সেট আপ করা হয়। যদিও NET এর এটি করার দক্ষ ব্যবস্থা আছে তবে এটি যথেষ্ট ওভারহেড। সুতরাং, আপনার যদি কেবল একটি সাধারণ ক্রিয়াকলাপ করতে হয় (যেমন একটি যোগফল বা গুণ), সমান্তরাল অগ্রণীটি দ্রুত হওয়া উচিত নয়।
মার্টাও

3
@ জিগনেশ এটি খুব ভাল পরিমাপের উদাহরণও নয় তাই আমি এটিকে মোটেই উল্লেখ করব না। "থ্রেড.স্লিপ (10)" সরান; প্রতিটি লুপের শরীর থেকে আবার চেষ্টা করুন।
কঠোরভাবে

1
@ মারতাও ঠিক আছে, অবজেক্ট লকিং ওভারহেডের সাথে সমস্যা যেখানে সমান্তরাল পদ্ধতির অনুক্রমের চেয়ে দীর্ঘ হতে পারে।
কঠোরভাবে

8
@ ধীরে ধীরে আমি মনে করি ঘুম ঠিক এই কারণেই এটি একটি ভাল উদাহরণ good আপনি দ্রুত একক পুনরাবৃত্তির সাথে পিএফই ব্যবহার করবেন না (যেমন মার্টাও ব্যাখ্যা করেছেন) - সুতরাং এই উত্তরটি পুনরাবৃত্তিটি ধীর করে দিচ্ছে, এবং পিএফইর (সঠিক) সুবিধা হাইলাইট করা হয়েছে। আমি একমত যে যদিও এর উত্তরে এটি ব্যাখ্যা করা দরকার, একটি সাহসী "সর্বদা দ্রুত" খুব বিভ্রান্তিকর।
মাফু

43
string[] lines = File.ReadAllLines(txtProxyListPath.Text);

// No need for the list
// List<string> list_lines = new List<string>(lines); 

Parallel.ForEach(lines, line =>
{
    //My Stuff
});

এটি লুপগুলির মধ্যে সমান্তরালভাবে লাইনগুলি পার্স করার কারণ ঘটবে। আপনি যদি সমান্তরাল শ্রেণীর আরও বিশদ, কম "রেফারেন্স ওরিয়েন্টেড" পরিচিতি চান, আমি টিপিএলে একটি সিরিজ লিখেছিলাম যার মধ্যে সমান্তরাল.ফরএচের একটি বিভাগ অন্তর্ভুক্ত রয়েছে ।


9

বড় ফাইলের জন্য নিম্নলিখিত কোডটি ব্যবহার করুন (আপনি ক্ষুধার্ত স্মৃতিশক্তি কম)

Parallel.ForEach(File.ReadLines(txtProxyListPath.Text), line => {
    //Your stuff
});

2

এই লাইনে আমার জন্য কাজ।

string[] lines = File.ReadAllLines(txtProxyListPath.Text);
var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount * 10 };
Parallel.ForEach(lines , options, (item) =>
{
 //My Stuff
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.