با استفاده از دستور:
foreach
در C# میشود به راحتی روی ردیفهای هر جدول محاسبت را انجام داد و به مقصود رسید.
اما با توجه به اینکه تعداد محاسبات زیاد است و بعضی از آنها بدون آنکه به نتیجهٔ قبلی محاسبات دیگر کاری داشته باشند قابل اجرا هستند چه روشی را پیشنهاد میکنید تا به صورت موازی بتوان محاسبات را انجام داد
Parallel.For رو دیدی ؟ چون جزییات بیشتری ندادی ، کد نمی تونم بهت بدم (ببین ، تو کدی رو که میخوای بر روی داده هات محاسبات انجام بده ، داخل بدنۀ Parallel.For قرار میدی و کدت به صورت موازی اجرا میشه. کلا در اینطور مواقع استفاده از Parallel.For یا Parallel.ForEach راحت ترین گزینه است)
با توجه به این که گفتی داده هات قابل تبدیل به IEnumerable نیستن ، پس نمی تونی از PLINQ استفاده کنی.
(در اف شارپ ، اگر تابع جدایی برای انجام محاسبات بر روی DataTable داری ، می تونی از Async.Parallel استفاده کنی)
{به دلیل این که در این سناریوی خاص ،هیچ تفاوتی بین سی شارپ و اف شارپ نیست و هر دو در نهایت از یک کلاس و متد استفاده خواهند کرد ، مزیتی در استفاده از اف شارپ عایدت نخواهد شد}
استفاده از روش های موجود ، بستگی به فاکتور هایی مثل "وابستگی هر مرحله از پردازش به نتایج مرحلۀ قبل" ، "آماده بودن داده ها هنگام شروع پردازش" و ... داره
چند تا مثال از انجام محاسبات موازی می زنم تا بتونی کمک بگیری (اگر واقعا کدت داره به خوبی اجرا میشه و کند هم نیست ، بهتره دردسر های ناشی از موازی کردن رو به جون نخری. بعضی وقت ها پیاده سازی غلط کد می تونه باعث بشه کدت کندتر از حالت معمولی اجرا بشه)
استفاده از async در اف شارپ برای محاسبه و نمایش اعداد فیبوناچی 1 تا 40
let rec fib x = if x <= 2 then 1 else fib(x-1) + fib(x-2)
let fibs =
seq [ for i in 0..40 -> async { return fib(i) } ]
|> Async.Parallel
|> Async.RunSynchronously
Seq.iter (fun x -> printfn "%d" x) fibs
مثال: Parallel.For در سی شارپ
class Program
{
static long Fibo1(int n)
{
if (n <= 1)
return 1;
else
return Fibo1(n - 1) + Fibo1(n - 2);
}
static void Main(string[] args)
{
Parallel.For(0, 50, delegate(int n)
{
Console.WriteLine(Fibo1(n));
});
}
مثال: PLinq در سی شارپ
var result = (from p in db.Products join pd in xml.ProductDescriptions on p.ID equals pd.ID where p.Price > 100 select new { p.Name, p.Price, pd.Description }).AsParallel();
{توجه کن که اینا فقط مثال بودن. حتی برای کار ساده ای مثل محاسبۀ فیبوناچی هم می شد کد رو کلی بهینه تر کرد و ...، منتها خواستم فقط فرمت کلی و روش استفاده رو ببینی. بهینه و موازی کردن هر کدی ساعت ها و روز ها وقت می بره، و یکی از علل تاکید من و آقای موسوی بر درک و طراحی درست مسئله ، همین بود. بعضی وقت ها وقت مهم انسان ، صرف ریز بهینه سازی های ماشین میشه که مسلما ارزشش رو نداره }
پ ن: کلی وقت گذاشتم اینو نوشتم ، بعد دیدم پستت رو آپدیت کردی !