# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > F#‎‎ >  F#‎ Samples and Questions for Parallel data mining

## بابک56

من یک دیتاست (Dataset)در سی شارپ دارم که میخوام اون رو به اف شارپ منتقل کنم (Pass to F#‎ Function)تا به صورت موازی (Parallel using Async Seq or function)تغییراتی در اون بدم. آیا نمونه کدی برای این کار می شناسید ؟ (اگه نمونه کد LINQ باشه عالی میشه)

----------


## بابک56

یک مقدار راهی‌ رو که طی‌ کردم توضیح میدم و اشکالات رو میگم،امیدوارم از اساتید اگه کسی‌ تونست راهنمای کنه.

مرحله اول ارسال Dataset به ‌‌‌#F از طریقه C#‎‎ هست که مشکلی‌ نیست!
     (let FsharpFun (Idt:DataSet 

البته اوایل این کد رو زدم :
let FFF ds=
           let dataSet = new DataSet()
            let i="0"
            if(i<>"0") then do ds = dataSet.Copy()
            let tbl=ds.Tables.Item(0) 

چون نمیدونستم می‌شه به کامپایلر دستی‌ فهموند چه دیتا تیپی میگیره :p

ادامه:

 ولی‌ برای ساده تر شدن کار یکی‌ از DataTableهارو میفرستیم :
     (let FsharpFun (Idt:DataTable 
حالا می‌خوام محاسباتی رو رو‌های این Datatable بکنیم و بد از تغییر Table ، نتیجه به صورت Table به #C برگرده

این محاسبت اگر به این صورت  بشه :
  for row in tbl.Rows do
               if(row.Item("GenericProduct").ToString()="") then do 
                row.Item("GenericProduct")<- -12
                if(row.Item("ItemNumber").ToString()="") then do
                row.Delete()

قابلیت Parallel شدن نداره چون Dataset یا Datatable از نوع یIEnumarable نیست، لذا باید دست به دامن list شد.
برای این منظر با کد زیر می‌شه یک Seq از Row‌های یک Column تولید کرد :
let models = Idt.Rows |> Seq.cast<System.Data.DataRow> |> Seq.map (fun dr -> (dr.["ItemNumber"].ToString()))
ولی‌ همچنان داستان مشکل داره!
یعنی‌ باید به ازای هر Column یک لیست داشت؟

Query زدن روی لیستها چطوری می‌شه اونوقت؟

کلا راه درسته یا غلط؟

----------


## Mehdi Asgari

من پستت رو نخوندم (توضیحاتت ناخوانا و کدهات unaligned هستند)
ولی قبل از تلاش برای جواب دادن بهت ، باید این سوال رو جواب بدی که چرا میخوای بخش موازی سازی کدت رو بفرستی به اف شارپ ؟ ایا سی شارپ قادر به انجام کاری که میخوای بکنی نیست ؟
در کنار جواب دادن به این سوال من ، مسئله ات رو با تفصیل بیشتری شرح بده تا بی سوادهایی مثل من قادر به درک سوالت باشند

----------


## بابک56

اختیار دارید استاد،این حرفا چیه.

من واقعا نمیدونم چطوری می‌شه کد  رو بهتر تو پست نشون داد،شرمنده اگر بده.

اینکه میفرمائید چرا از C#‎‎ استفاده نمیکنم برای اینکه  ‌‌‌#F برای این اومده که کارای پرللل رو با کد کمتر و Safe تر انجام بده دیگه!

وقتی‌ که می‌شه با Async و ! , function رو Parallel کرد چرا که نه؟

حالا نمیدونم شاید من کدو رو دیدم فقط ... :p

مساله سادست، می‌خوام یه Table بفرستم اونجا چند Function به صورت همزمان  بیفتن به جونش.

Parallel کردن رو اصلا بی‌خیال، 

فعلا تو مرحلهٔ اول که تبدیل Datatable به یک فرمت قابل پرللل  شدن(IEnumarable)  و قابل استفاده در Linq to Object باشه در موندم!

----------


## Mehdi Asgari

ببین دوست من، این کار یعنی توهم و hype زدگی.
 async بیشترین موارد کاربردش در کارای I/O bound هست ، نه CPU bound (مثلا برای نوشتن یه web crawler ، گزینۀ مناسبیه)
سی شارپ هم درست مثل اف شارپ به Task Parallel Library و PLINQ دسترسی داره؛ چرا میخوای لقمه رو دور سرت بچرخونی ؟؟ (اف شارپ یاد بگیری ، بعد بتونی کارت رو درست parallelize کنی ، بعد ساختار هایی رو بین دو زبان pass کنی. بیکاری ؟ همون کار رو در سی شارپ انجام بده و خودتو خلاص کن.)
سی شارپ و اف شارپ هر دو ابزارن. وقتی کار فعلیتو با هزینۀ کمتر (و به صورت reliable تری ) می تونی با سی شارپ انجام بدی ، چه توجیهی در استفادۀ اف شارپ هست ؟ (اف شارپ رو می تونی به مرور یاد بگیری و در آینده ازش استفاده کنی ، منتها با علم به این که دقیقا میخوای چیکار کنی و چرا این ابزار رو به یک ابزار دیگه ترجیح میدی)
مکانیسم انتخاب ابزار برای یک برنامه نویس حرفه ای ، مبتنی بر هزینه/منفعت هست. اگر هزینه ای که یادگیری اف شارپ و استفاده از اون برات خواهد تراشید (پول ، وقت ، ...) در trade-off با منفعت حاصله ، چیز معناداری میشه ، بسم الله ؛ یاعلی رو بگو و مشکلت رو کامل شرح بده و انتظار کمک داشته باش، ولی وقتی با دانش فعلی می تونی کارت رو انجام بدی و پولت رو هم به جیب ، دستمال رو صرف چیزی غیر از بستن سر سالم بکن
به هر حال من چیزی رو که صلاح می دونستم (نحوۀ انتخاب و دید غیر مبتنی بر ابزار و تبلیغات رسانه های بیگانه) بهت گفتم ، صلاح مملکت خویش ....

----------


## بابک56

ممنون از توضیحاتت، من تجربهٔ کمی‌ در پرللل کردن با #C دارم،یکی‌ از چیزایی‌ که تو #C برخوردم و ترسوند منو این بود که وقتی‌ شما به یک Share memory دسترسی داری و Parallel functions در حال کار با اون هستن امکان خطا و دستکاری به شکلی‌ که فکرشو نمیکنی‌ هست، مثلا وقتی‌ function‌ها تو در تو هم دیگرو صدا می‌کنن، راه حل هم داره ولی‌ گاهان منجر به dead lock ممکن بشه و ... ، خلاصه که اینو فهمیدم که پرللل کردن برنامه فقط کد زدن نیست و تجربهٔ استفاده هم می‌خواد که من ندارم و جرات نمیکنم تو این پروژه از دانسته‌های کمم استفاده کنم ، وقتی‌ فهمیدم ‌‌‌#F ساده تر با موضوع برخورد می‌کنه و از طرفی‌ Safe بودن عملیات یه جورای تضمین هست گفتم با ‌‌‌#F کار کنم. 

حالا بد از کلی‌ کلفت بار کردن و تفتیش عقاید شما میتونی‌ کمک کنی‌ یه Table رو بفرستیم تو ‌‌‌#F یه Query بزنیم جوابو برگردنیم یا نه؟

----------


## mehdi.mousavi

سلام.
این کارها واسه چیه؟ فرض کنید فلان زبان توانایی خارق العاده ای در بهره گیری از فلان قابلیت داره. آیا این به این معنا هستش که باید اون بخش از پروژه رو شما در فلان زبان انجام بدید و ... (پوووف). به این ترتیب تو یه پروژه کوچک شما باید از 50 تا تکنولوژی استفاده کنید و در هر پروسه، از 20 مرحله گذر کنید و ...

اصلا این نیاز از کجا ناشی میشه که شما می خواهید همزمان در DataSet خودتون تغییراتی اعمال کنید؟ چنین نیازهایی عموما بیانگر عدم طراحی یک Solution خوب در برنامه های Data-Centric هستش.

اگر مایل بودید، مساله رو در بخش C#‎ و در تاپیک جدیدی مطرح کنید تا به اون پاسخ داده بشه (البته با ذکر جزییات مساله!)

موفق باشید.

----------


## Mehdi Asgari

> ن تجربهٔ کمی‌ در پرللل کردن با C#‎‎ دارم،یکی‌ از چیزایی‌ که تو C#‎‎ برخوردم و ترسوند منو این بود که وقتی‌ شما به یک Share memory دسترسی داری و Parallel functions در حال کار با اون هستن امکان خطا و دستکاری به شکلی‌ که فکرشو نمیکنی‌ هست، مثلا وقتی‌ functionها تو در تو هم دیگرو صدا می‌کنن، راه حل هم داره ولی‌ گاهان منجر به dead lock ممکن بشه و ... ، خلاصه که اینو فهمیدم که پرللل کردن برنامه فقط کد زدن نیست و تجربهٔ استفاده هم می‌خواد که من ندارم و جرات نمیکنم تو این پروژه از دانسته‌های کمم استفاده کنم ، وقتی‌ فهمیدم #F ساده تر با موضوع برخورد می‌کنه و از طرفی‌ Safe بودن عملیات یه جورای تضمین هست گفتم با #F کار کنم


قیاس غلطی که کردی و توهم Safe بودنی که معلومه تاثیر media hype بوده ، باعث شده تو فکر کنی صرف استفاده از یک ابزار دیگه مثل اف شارپ به تنهایی باعث خواهد شد مشکلت رو بتونی حل کنی. بهتره یک بار دیگه در مورد اف شارپ و مفهوم Safety و تضمین بودن عملیات مطالعه کنی و بعد هر اشکالی داشتی بپرسی و یاد بگیری. (کسی که هنوز تفاوت Async و Parallel رو نمی دونه ، بهتره اصلا وارد این وادی ها نشه)



> حالا بد از کلی‌ کلفت بار کردن و تفتیش عقاید شما میتونی‌ کمک کنی‌ یه Table رو بفرستیم تو #F یه Query بزنیم جوابو برگردنیم یا نه؟


این که وقت می ذاریم و به پستت داریم جواب می دیم و هی در مورد مسئله ات ازت سوال می پرسیم تا بتونیم بهتر کمکت کنیم ، اسمش تفتیش عقاید نیست. من هنوز وقتی متوجه منطق پاس دادن داده ها به اف شارپ نیستم ، چطور بیام روی مسئلۀ ساختگی ات (پردازش همزمان DataSet ها) فکر کنم ؟
اگر مایل بودی یه چیزی یاد بگیری ، طبق فرمایش برادر موسوی ، سوالت رو مفصل در اینجا یا بخش سی شارپ مطرح کن تا کسانی چون ایشون یا بنده بهت کمک کنن (و چه بسا با تغییر در طراحی برنامه ات ، متوجه اشکالات احتمالی ات در طراحی کدت بشی) ، وگرنه  در صورتی که همچنان مصری که از اف شارپ استفاده کنی و با لحن طلبکارانه صحبت کنی ، بهتره تو یه فروم دیگه مشکلت رو مطرح کنی

----------


## بابک56

طرف میره به رفیقش میگه آقا لطف کنید به من وام بدید،رفیقش میگه نوکرت هم هستم تو جون بخواه فقط بگو واسه چی‌ می‌خوای؟

میگه می‌خوام زن بگیرم،جواب میشنوه بابا مگه عقلت کمه و یه سری حرفا از مشکلات زن گرفتن.

حالا حکایت ما شده.

جناب مدیر بخش آقا من می‌خوام بدونم با یه Table تو #F چه طوری باید کار کنم، این قصه‌ها چی‌ واسه من میگید؟

شما اگه یه فایل اکسل داشته باشی‌ که بخوای اطلاعات رو بده به Sql و بد یه سری محاسبات بشه و در حالت آفلاین هم بتونه کاربر ازش یه چیزایی‌ بگیره مجبوری قسمت آفلاین رو تو خود اکسل با VBA بنویسی‌، یه بخش رو مثلا با C#‎‎‎ و ممکن بخاطر مسائلی مثل نداشتن کپی‌ رایت .net ۳ و استفاده از Query,Linq هات به زبان Sql باشه،پیچیده تره ش هم نمیکنم که بگم اگر بخوای رو وب نشون بدی ممکن کارفرما بگه می‌خوام تمام فلش باشه و مجبور بشی‌ اکشن اسکریپت و XML کار کنی‌ یا ...
--------------------------------------------------------------------------------------------------------------------------------------------
توهم اشتباه در مورد مسائل فنی‌ بهتر از توهم خود بزرگ بینیه دوست عزیز.

بنده در پست قبل مودبانه از شما سوال کردم، شما خط اول پستتنو بخونید ببینید لحن صحبت شما نشان از چی‌ داره و کی‌ طلبکاره.

مطمئناً در فروم خارجی‌ کسی‌ در جواب سوال من نمیگه حالا واسه چی‌ می‌خوای؟! یا برو بابا توهم زدی هایپ خونت رفته بالا و ...

ضمنا چیزی که تا حالا گرفتم جواب نبوده از این به بد هم منتظر جوابش نیستم چون جوابش حداکثر چند خط کد هست که اینجا جز ادعا چیزی پیدا نمی‌شه.

موفق باشید

----------


## mehdi.mousavi

> حالا حکایت ما شده. جناب مدیر بخش آقا من می‌خوام بدونم با یه Table تو #F چه طوری باید کار کنم، این قصه‌ها چی‌ واسه من میگید؟


سلام.
مشکل بیشتر ما ها، بی اطلاعی از همین قصه هاست. من در قالب همین به اصطلاح قصه ها هستش که میتونم به اصل مساله پی ببرم و برای مشکل اصلی (که عموما زیر خروارها تفکر نادرست مدفون شده)، راه حلی اصولی ارائه بدم. و الا قصد من هم این نیست که اینجا بشینم وقتم رو به باد بدم و برای شما یا دیگران داستان تعریف کنم...




> شما اگه یه فایل اکسل داشته باشی‌ که بخوای اطلاعات رو بده به Sql و بد یه سری محاسبات بشه و در حالت آفلاین هم بتونه کاربر ازش یه چیزایی‌ بگیره مجبوری قسمت آفلاین رو تو خود اکسل با VBA بنویسی‌، یه بخش رو مثلا با C#‎‎‎‎‎ و ممکن بخاطر مسائلی مثل نداشتن کپی‌ رایت .net ۳ و استفاده از Query,Linq هات به زبان Sql باشه،پیچیده تره ش هم نمیکنم که بگم اگر بخوای رو وب نشون بدی ممکن کارفرما بگه می‌خوام تمام فلش باشه و مجبور بشی‌ اکشن اسکریپت و XML کار کنی‌ یا ...


یا متوجه منظورم شدید، یا واقعا متوجه نشدید من چی خدمتتون عرض کردم. این مقایسه ای که انجام دادید، مقایسه کاملا نادرستی هستش و اصلا ربطی به موضوع نداره. اجازه بدید یه بار دیگه به یه بیان دیگه خدمتتون عرض کنم. همونطور که میدونید، C++‎‎ توانایی بهره گیری از Multiple Inheritance رو داره. حالا ما داریم یه برنامه تو محیط .NET مینویسم که از Single Inheritance فقط پشتیبانی میکنه. آیا این صحیح هستش که من بشینم چند تا کلاس توی C++‎‎ طراحی کنم و از MI سود ببرم، به صرف اینکه محیط Managed از اونها پشتیبانی نمیکنه؟ یا یه جایی نیاز به استفاده از closure ها داشتم، آیا این خوبه که اون بخش از کدم رو بصورت یه ماژول جدا توی JavaScript انجام بدم؟ یا در بخشی از برنامه نیاز به انجام موازی برخی کارها دارم و شنیدم که F#‎ توانایی هایی در این زمینه داره. آیا این درسته اون بخش از نرم افزار رو در F#‎ انجام بدم و ...؟ (من منظورم این بود! اینطوری، هر پروژه کوچکی، 20 تا ماژول میخواد، که هر کدوم به 20 زبان مختلف نوشته میشن و ... در نهایت هم Overall Performance کار بسیار پایین تر از حد تصور خواهد بود). و الا استفاده از XML، SQL، LINQ و ... هر کدوم در جایگاه خودشون، کاری کاملا شایسته هستش.




> مطمئناً در فروم خارجی‌ کسی‌ در جواب سوال من نمیگه حالا واسه چی‌ می‌خوای؟! یا برو بابا توهم زدی هایپ خونت رفته بالا و ...


من هر جا احساس نیاز کنم که "مساله اصلی" زیر انبوهی از افکار نادرست "پنهان" شده، همواره و همه جا (انجمن داخلی یا خارجی) ابتدا سعی میکنم ببینم مشکل اصلی چی بوده که شما رو به استفاده از فلان روش مجاب کرده.

ضمنا منظور آقای عسگری از عبارت Media Hype این بودش که "جو بوجود اومده از F#‎ و مسائل پیرامون اون که در رسانه ها در موردش تبلیغ میشه روی شما تاثیر گذاشته"، نه اون چیزی که شما برداشت کردید!




> ضمنا چیزی که تا حالا گرفتم جواب نبوده از این به بد هم منتظر جوابش نیستم چون جوابش حداکثر چند خط کد هست که اینجا جز ادعا چیزی پیدا نمی‌شه. موفق باشید


من خودم با F#‎ رابطه ای ندارم، اما می تونید سوالتون رو در صورت تمایل در این انجمن مطرح کنید.

موفق باشید.

----------


## بابک56

ممنون دوست عزیز ، با اون عبارت *توهم* که همکارتون گفت یه مقدار احساس بدی کردم و تند رفتم، امیدوارم از من ناراحت نباشید، البته شما و همکارتون بزرگوار تر از این حرفا هستید.

خلاصه به امروز که روز تولد من هست ببخشید همگی‌ ماچو برسونید ؛)

من یک بار دیگه سوالام رو توضیح میدم،بد شما ببینید کجا صلاح میدونید مطرح بشه یا کلا چه خطی‌ رو بگیرم بهتره.

یک دیتابیس کوچک که به راحتی‌ در رم لود میشود داریم.

می‌خواهیم با استفاده از اطلاعات آن یک سری محاسبات انجام دهیم و نتیجه را دوباره در بانک اطلاعاتی ذخیره کنیم.

با استفاده از دستور: 
foreach 
 در C#‎‎‎‎‎ میشود به راحتی‌ روی ردیف‌های هر جدول محاسبت را انجام داد و به مقصود رسید.
اما با توجه به اینکه تعداد محاسبات زیاد است و بعضی‌ از آنها بدون آنکه به نتیجهٔ قبلی محاسبات دیگر کاری داشته باشند قابل اجرا هستند چه روشی‌ را پیشنهاد می‌کنید تا به صورت موازی بتوان محاسبات را انجام داد؟

و آیا راهی‌ برای پرللل کردن محاسباتی که وابستگی با نتایج قبلی‌ دارد هم می‌توان متصور بود یا خیر؟
لطفا زیر دیپلم و ترجیحا با کد (F or C#‎‎‎‎‎)راهنمای بفرمائید.اگر قرار است که کلا ‌‌‌#F نباشد دلیلش را بفرمائید.    
ممنون از وقت ای‌ که میگذارید.
------------------------------------------------------------------------------------------------------------------
با فرض فراموش کردن ‌‌‌#F :

برای این کار C#‎‎‎در ۲ روش وجود داره ، یکی‌ Plinq  ، یکی‌ هم Parallel.ForEach .حالا سوال اینه که اولا تجربهٔ شما کدوم رو بیشتر تأیید می‌کنه .

۲ اینکه در حالتی که Function‌ها هر کدوم به صورت تو در تو همدیگرو صدا می‌کنن و هر کدوم از فونکتین‌های child خودشون ممکن Parent دیگر Function‌ها باشند و به شخصه هم بخواهند عملیات پرللل انجام بدهند آیا شما مطمئنید که مشکلی‌ پیش نمیاد؟

اجازه بدید یه مثل ساده بزنم از Function‌های تو در تو و مشکلی‌ که پیدا می‌کنن :
using System;
using System.Threading;

namespace test
{
	/// <summary>
	/// Summary description for Class1.
	/// </summary>
	class Class1
	{
		/// <summary>
		/// The main entry point for the application.
		/// </summary>
		[STAThread]
		static void Main(string[] args)
		{
			//
			// TODO: Add code to start application here
			//

			Class1 c1 = new Class1();


			Console.ReadLine();

			c1.StopThreads = true;
		}

		private bool _stopThreads = false;

		public bool StopThreads
		{
			set
			{
				_stopThreads  = value;
			}
		}


		// shared memory variable between the two threads
		private string _threadOutput = "";

        void DisplayThread0()
        {
            while (_stopThreads == false)
            {

                    Console.WriteLine("Display Thread 1");
                    _threadOutput = "Hello Thread1";
                    Thread.Sleep(1000);  // simulate a lot of processing

                    // tell the user what thread we are in thread #1
                    Console.WriteLine("Thread 1 Output --> {0}", _threadOutput);

            }

        }

        /// <summary>
        /// Thread 2, Displays that we are in thread 2
        /// </summary>
        void DisplayThread00()
        {
            while (_stopThreads == false)
            {

                    Console.WriteLine("Display Thread 2");
                    _threadOutput = "Hello Thread2";
                    Thread.Sleep(1000);  // simulate a lot of processing

                    // tell the user we are in thread #2
                    Console.WriteLine("Thread 2 Output --> {0}", _threadOutput);

            }
        }
		/// <summary>
		/// Thread 1, Displays that we are in thread 1
		/// </summary>
		void DisplayThread1()
		{
			while (_stopThreads == false)
			{
				lock (this)
				{
					Console.WriteLine("Display Thread 1");
					_threadOutput = "Hello Thread1";
					Thread.Sleep(1000);  // simulate a lot of processing

					// tell the user what thread we are in thread #1
					Console.WriteLine("Thread 1 Output --> {0}", _threadOutput);
				}
			}

		}

		/// <summary>
		/// Thread 2, Displays that we are in thread 2
		/// </summary>
		void DisplayThread2()
		{
			while (_stopThreads == false)
			{
				lock (this)
				{
					Console.WriteLine("Display Thread 2");
					_threadOutput = "Hello Thread2";
					Thread.Sleep(1000);  // simulate a lot of processing

					// tell the user we are in thread #2
					Console.WriteLine("Thread 2 Output --> {0}", _threadOutput);
				}
			}
		}

		AutoResetEvent _blockThread1 = new AutoResetEvent(false);
		AutoResetEvent _blockThread2 = new AutoResetEvent(true);

		void DisplayThread_1()
		{
			while (_stopThreads == false)
			{
				   // block thread 1  while the other is executing
				    _blockThread1.WaitOne();

				    // Set was called to free the block on thread 1, continue executing the code
					Console.WriteLine("Display Thread 1");
					_threadOutput = "Hello Thread 1";
					Thread.Sleep(1000);  // simulate a lot of processing

					// tell the user what thread we are in thread #1
					Console.WriteLine("Thread 1 Output --> {0}", _threadOutput);

				    // finished executing the code in thread 1, so unblock thread 2
					_blockThread2.Set();
			}

		}

		/// <summary>
		/// Thread 2, Displays that we are in thread 2
		/// </summary>
		void DisplayThread_2()
		{
			while (_stopThreads == false)
			{
				// block thread 2  while the other is executing
					_blockThread2.WaitOne();

				// Set was called to free the block on thread 2, continue executing the code
					Console.WriteLine("Display Thread 2");
					_threadOutput = "Hello Thread 2";
					Thread.Sleep(1000);  // simulate a lot of processing

					// tell the user we are in thread #2
					Console.WriteLine("Thread 2 Output --> {0}", _threadOutput);

				// finished executing the code in thread 2, so unblock thread 1
				    _blockThread1.Set();
			}
		}


		Class1()
		{
			// set up and start threads;
//			Thread thread1 = new Thread(new ThreadStart(DisplayThread1));
//			Thread thread2 = new Thread(new ThreadStart(DisplayThread2));

			Thread thread1 = new Thread(new ThreadStart(DisplayThread0));
			Thread thread2 = new Thread(new ThreadStart(DisplayThread00));

			// start them
			thread1.Start();
			thread2.Start();
		}


	}
}
----------------------------------------------------------------------------------------------------------------------------------------------
سوال بعدی که پیش میاد اینه که هر کدوم از این  Table ها یک همچین داستان ی داره، چطور Function اولم رو باید بنویسم که بتونه همرو Parallel اجرا کنه ، یعنی‌ یه همچین چیزی :
MainFunction()
{
Pfun1(datatable1)
Pfun2(datatable2)
Pfun3(datatable3)
.
.
.
}

----------


## Mehdi Asgari

> با استفاده از دستور:
> 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();

{توجه کن که اینا فقط مثال بودن. حتی برای کار ساده ای مثل محاسبۀ فیبوناچی هم می شد کد رو کلی بهینه تر کرد و ...، منتها خواستم فقط فرمت کلی و روش استفاده رو ببینی. بهینه و موازی کردن هر کدی ساعت ها و روز ها وقت می بره، و یکی از علل تاکید من و آقای موسوی بر درک و طراحی درست مسئله ، همین بود. بعضی وقت ها وقت مهم انسان ، صرف ریز بهینه سازی های ماشین میشه که مسلما ارزشش رو نداره }


پ ن: کلی وقت گذاشتم اینو نوشتم ، بعد دیدم پستت رو آپدیت کردی !

----------


## بابک56

با تشکر بسیار از شما ،

در رابطه با سوال آخرم، فکر می‌کنم استفاده از Invoke راه حل باشه،چون می‌خواهیم Function‌‌‌ صدا بزنیم
 تا نظر شما چی‌ باشه.

هنوز متوجه نشدم که وقتی‌ مثلا F۱ داره روی Table۱ محاسبات می‌کنه و F‌‌‌۲ هم روی همون Table قراره محاسبات بکنه و F‌‌‌۱ و F‌‌‌۲ پرللل هستند و F‌‌‌۲ باید بد از اجرای پردازش توسط F‌‌‌۱ کارش رو انجام بده چطور می‌شه از دستکاری اطلاعات توسط F‌‌‌۲ قبل از F‌‌‌۱ جلوگیری کرد.

به عبارتی همون مثل که کدش رو خدماتتون دادم رو ببینید یه جورای ته دلم میترسه از کار موازی تو C#‎ ، فکر می‌کنم F‌‌‌# کمپیلرش خودش هندل می‌کنه این چیزارو و دلیل اینکه اوریجینال دیتا رو دست نمیزنه همینه .

اگر راهنمایی کنید که در حالتی که تو در تو پرللل داریم چطور می‌شه مطمئن بود و مشکلات غیر همزمانی که در کد خدماتتون نشون دادم چطوری قابل حل هست بینهایت سپاس س گذار خواهم بود.

----------


## Mehdi Asgari

> در رابطه با سوال آخرم، فکر می‌کنم استفاده از Invoke راه حل باشه،چون می‌خواهیم Function‌‌‌ صدا بزنیم


برای فراخوانی همزمان توابع ، خوبه.



> هنوز متوجه نشدم که وقتی‌ مثلا F۱ داره روی Table۱ محاسبات می‌کنه و F‌‌‌۲ هم روی همون Table قراره محاسبات بکنه و F‌‌‌۱ و F‌‌‌۲ پرللل هستند و F‌‌‌۲ باید بد از اجرای پردازش توسط F‌‌‌۱ کارش رو انجام بده چطور می‌شه از دستکاری اطلاعات توسط F‌‌‌۲ قبل از F‌‌‌۱ جلوگیری کرد.


نه  دیگه ، نشد! قرار نبود همزمان داده ها رو دستکاری کنن ، وگرنه مشکلات عدیده ای پیش می یاد (و باید  روی داده ها lock بذاری که گند می زنه به پرفورمنس)



> به عبارتی همون مثل که کدش رو خدماتتون دادم رو ببینید یه جورای ته دلم میترسه از کار موازی تو C#‎‎‎ ، فکر می‌کنم F‌‌‌# کمپیلرش خودش هندل می‌کنه این چیزارو و دلیل اینکه اوریجینال دیتا رو دست نمیزنه همینه .


ربطی به کامپایلر نداره. هر دوی زبان ها دسترسی به یک رانتایم و ThreadPool و کلاس لایبرری ... دارند و مدل هر دو Shared Memory هست. فقط در بعضی موارد کد نوشته شده در اف شارپ تمیز تر و کوتاه تره (تو که میخوای داده هات رو دستکاری کنی ، چه فرقی می کنه با سی شارپ باشه یا اف شارپ). تازه بخوای به تعداد زیاد داده ها رو duplicate کنی (تا بخوای دادۀ اصلی دست نخورده باقی بمونه و به ارمان های immutability پایبند بمونی) مشکلات ناشی از کپی کردن و نیز بعدش Synchronization خواهی داشت که باز به حرف من می رسی که بهتره کدت رو اصلا موازی نکنی.

ببین برادر: تو با توجه به سوالایی که می پرسی تجربۀ خیلی زیادی در مورد برنامه نویسی موازی نداری. بهتره که کدت رو همونطور که هست بذاری باقی بمونه (اگر میخوای یاد بگیری ، خب برو کتاب بخون و از صفر با مفاهیم اشنا بشو. من که نمی تونم وقت بذارم پروژۀ تو رو انجام بدم؛ که اگر انجام هم بدم باز بعدها مشکل خواهی داشت در ادامه و نگهداری برنامه ات)

----------


## بابک56

> ببین برادر پاریس رفتۀ من: تو با توجه به سوالایی که می پرسی تجربۀ خیلی زیادی در مورد برنامه نویسی موازی نداری. بهتره که کدت رو همونطور که هست بذاری باقی بمونه (اگر میخوای یاد بگیری ، خب برو کتاب بخون و از صفر با مفاهیم اشنا بشو. من که نمی تونم وقت بذارم پروژۀ تو رو انجام بدم؛ که اگر انجام هم بدم باز بعدها مشکل خواهی داشت در ادامه و نگهداری برنامه ات)


 من عکس و محل رو از تو پروفایلم بر میدارم چون فکر کنم شما آلرژی داری نسبت به بعضی‌ چیزا و لحنت نا خود آگاه تند می‌شه.
کی‌ خواست شما پروژه رو انجام بدی؟ 
بنده ادعا نکردم که از پرللل پروگرممینگ چیزی سرم می‌شه، شما اگر بیشتر به متن پست‌ها بجای کلاه و محل زندگی‌ من نگاه کنی‌ اینو راحت تر از اونی که فکرش رو میکنی‌ متوجه میشی‌.
قبلان هم گفت بودی کسی‌ که فرق چیو چی‌ رو نمیدونه نیاد تو این وادی‌ها بهتره و ...
شما فکر میکنی‌ پرللل پروگرممینگ کار کردن یعنی‌ شاخ قول شکندن؟
خواهشن از این به بد وقت نگذار برای جواب دادن،چون با وجودی که قصدت ۱۰۰ در صد خیر هست به انرژی منفی‌ که میفرستی نمی‌ عرضه

* : غلط‌های املا رو پای behnevis بذار

موفق باشی‌

----------


## Mehdi Asgari

> شما فکر میکنی‌ پرللل پروگرممینگ کار کردن یعنی‌ شاخ قول شکندن؟


بله، ولی منظورم این نبود که تو رو ناامید کنم!
تو سعی می کنی به جای خوندن متن من ، اون رو تفسیر کنی. من میگم تو الان برای این که این کار رو انجام بدی (و از پس مشکلات احتمالیش بر بیای و شاید در آینده کدت رو آپدیت و نگه داری کنی) دانش زیادی نداری. (این از سطح سوال پرسیدنت معلومه). حالا اگه بری و در مورد برنامه نویسی موازی مطالعه کنی و چند تا از sample های دات نت رو ببینی و ... ، بعد دید پیدا کنی و بیای سوالاتت رو با جزییات (و درست) بپرسی، برای خودت بهتره. من دوست دارم بچه های فروم ، روش ماهی گرفتن رو یاد بگیرند؛ نه این که سریع یه کدی بهشون داده بشه و اونا هم بدون این که بدونن کد دقیقا چیکار می کنه ازش استفاده کنن.

----------


## بابک56

> بله، ولی منظورم این نبود که تو رو ناامید کنم!
> تو سعی می کنی به جای خوندن متن من ، اون رو تفسیر کنی. من میگم تو الان برای این که این کار رو انجام بدی (و از پس مشکلات احتمالیش بر بیای و شاید در آینده کدت رو آپدیت و نگه داری کنی) دانش زیادی نداری. (این از سطح سوال پرسیدنت معلومه). حالا اگه بری و در مورد برنامه نویسی موازی مطالعه کنی و چند تا از sample های دات نت رو ببینی و ... ، بعد دید پیدا کنی و بیای سوالاتت رو با جزییات (و درست) بپرسی، برای خودت بهتره. من دوست دارم بچه های فروم ، روش ماهی گرفتن رو یاد بگیرند؛ نه این که سریع یه کدی بهشون داده بشه و اونا هم بدون این که بدونن کد دقیقا چیکار می کنه ازش استفاده کنن.


من هم میگم اینکه بنده دانش زیادی ندارم رو در پست ۴ قبلان گفته ام!




> ممنون از توضیحاتت، من تجربهٔ کمی‌ در پرللل کردن با C#‎‎ دارم،یکی‌ از چیزایی‌ که تو C#‎‎ برخوردم و ترسوند منو این بود که وقتی‌ شما به یک Share memory دسترسی داری و Parallel functions در حال کار با اون هستن امکان خطا و دستکاری به شکلی‌ که فکرشو نمیکنی‌ هست، مثلا وقتی‌ function‌ها تو در تو هم دیگرو صدا می‌کنن، راه حل هم داره ولی‌ گاهان منجر به dead lock ممکن بشه و ... ، خلاصه که اینو فهمیدم که پرللل کردن برنامه فقط کد زدن نیست و تجربهٔ استفاده هم می‌خواد که من ندارم و جرات نمیکنم تو این پروژه از دانسته‌های کمم استفاده کنم


*بعد از این پست* همکار شما فرمودند با جزئیات مشکلت رو بگو تا کمک کنیم (نگفتند برو کتاب بخون تا کمک کنیم )این بود که بنده هنوز قطع امید از اینجا نکردم و همچنان پست میزنم .

----------

