|
Îåêßíçóå áðü ôï ìÝëïò Bill . Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 31-05-2012, 13:47. Υπάρχουν 17 απαντήσεις.
-
25-05-2012, 22:27
|
-
25-05-2012, 23:00
|
|
Τί ακριβώς θέλεις να κάνεις? Το TPL εκτελεί tasks τοπικά ενώ το Map/Reduce χρησιμοποιείται κατά κανόνα για να σπάσει η επεξεργασία σε πολλούς υπολογιστές. Παρόλα αυτά, έχει νόημα να χρησιμοποιήσεις MapReduce αν θέλεις να εκτελέσεις ένα αλγόριθμο γρήγορα σε ένα υπολογιστή.
Καταρχήν, το PLINQ και οι μέθοδοι looping της Parallel μπορούν να χρησιμοποιηθούν για να υλοποιησεις εύκολα ένα αλγόριθμο MapReduce: τo Where, Select, For ουσιαστικά αντιστοιχούν στο map καθώς εκτελούνται σε διαφορετικούς επεξεργαστές ενώ τυχόν aggregate functions που θα καλέσεις στο αποτέλεσμα, ή το enumeration που θα κάνεις, αντιστοιχούν στο Reduce.
Το ParallelExtensionsExtras περιέχει ξεχωριστά functions Map και Reduce στην κλάση ParallelAlgorithms για να υλοποιήσεις αλγόριθμους που δεν προσαρμόζονται εύκολα στο PLINQ αν και όπως θα δεις, η υλοποίηση χρησιμοποιεί το Parallel.For.
Παναγιώτης Καναβός, Freelancer Twitter: http://www.twitter.com/pkanavos
|
|
-
29-05-2012, 09:34
|
|
Ντροπή! Κάνεις μία ενδιαφέρουσα ερώτηση και την εγκαταλείπεις, και μας αφήνεις σε αναμένα κάρβουνα?
Υπάρχει άλλος ένας τρόπος να υλοποιήσεις Map-Reduce, χρησιμοποιώντας τα ActionBlock από τα Dataflow components της TPL. Μπορείς να ορίσεις ένα ActionBlock το οποίο θα υλοποιεί το map function και ένα το reduce function. Ένα action block υποστηρίζει μόνο ένα ταυτόχρονο task by default αλλά μπορείς άνετα να αλλάξεις τον αριθμό των παράλληλων tasks με μία παράμετρο. Με τον τρόπο αυτό μπορείς να ορίσεις ένα ολόκληρο pipeline το οποίο θα χρησιμοποιεί διαφορετικό parallelism για κάθε φάση. Κάθε ActionBlock έχει το δικό του input και output queue ενώ μπορείς να προσθέσεις και ξεχωριστά BufferBlock αν θέλεις κάποιο διαφορετικό buffering. Με τον τρόπο αυτό εξασφαλίζεις ότι κάθε block θα δουλεύει όσο γρήγορα μπορεί χωρίς να μπλοκάρει τα επόμενα ή προηγούμενα.
Όπως λέει και το όνομα, το Dataflow είναι πολύ καλό όταν έχεις συνεχή ροή δεδομένων.
Είτε με το TPL μόνο του, είτε με το Dataflow, μπορείς να σπάσεις την επεξεργασία σε διαφορετικά μηχανήματα βάζοντας τα blocks που κάνουν το map και τα blocks που κάνουν το reduce σε διαφορετικά σίδερα και στέλνοντας τα δεδομένα από το ένα μηχάνημα στο άλλο. Εδώ βέβαια θα πρέπει να φτιάξεις μόνος σου τον κώδικα που θα στέλνει/λαμβάνει τα μηνύματα, καθώς και το mapping από mapper σε reducer.
Τέλος, μπορείς να χρησιμοποιήσεις συνδυασμούς κλάσεων και από τις δύο βιβλιοθήκες. Για παράδειγμα, μπορείς να χρησιμοποιήσεις τα BufferBlock για να αποθηκεύεις γρήγορα τα μηνύματα που λαμβάνεις από τους mapper, απλοποιώντας φοβερά τον κώδικα της επικοινωνίας. Ή μπορείς να χρησιμοποιήσεις τα BufferBlock ως ενδιάμεση φάση ανάμεσα στα mapper και reducer loops σε μία λύση με Parallel.For
Έλα, πες τί έχεις στο μυαλό σου, μή μας βασανίζεις!
Παναγιώτης Καναβός, Freelancer Twitter: http://www.twitter.com/pkanavos
|
|
-
29-05-2012, 16:06
|
-
29-05-2012, 18:51
|
-
29-05-2012, 21:01
|
-
Bill
-
-

-
Μέλος από τις 09-11-2006
-
Greece
-
Δημοσιεύσεις 244
-
-
|
Βρήκα το παρακάτω παράδειγμα σε PLINQ για map / reduce κάτι απλό : 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| public static List<string> words = new List<string>
{
"there","is","a",
"great","house","and",
"an","amazing","lake",
"there","is","a","computer",
"running","a","new","query","there",
"is","a","greate","server","ready","to","process",
"map","and","reduce"
};
static void Main(string[] args)
{
// Map
// Generate a (word, 1) key, value pair
ILookup<string, int> map = words.AsParallel().ToLookup(p => p, k => 1);
// End of Map
// Reduce
// Calculate the number of times a word appears and
// select the words that appear more than once
var reduce = from IGrouping<string, int> wordMap
in map.AsParallel()
where wordMap.Count() > 1
select new
{ Word = wordMap.Key, Count = wordMap.Count() };
// End of Reduce
// Show each word and the number of times it appears
foreach (var word in reduce)
Console.WriteLine("Word: '{0}'; Count: {1}",
word.Word, word.Count);
Console.ReadLine();
} |
Οκ με το map το reduce query είναι σωστό ??? και γιατί είναι τόσο αργό ?
select DATEDIFF(dd,GetDate(),'20140731') AS EΠΟΜΕΝΕΣ_ΔΙΑΚΟΠΕΣ
|
|
-
29-05-2012, 23:32
|
|
Markos:
Μάρκο, μάλλον τα έμπλεξες. Αυτό που είδες στο codeplex είναι διαθέσιμο online τσάμπα από την Microsoft. Το βιβλίο, σε ebook ή τυπωμένο είναι διαθέσιμο από την O'Reilly και δεν είναι τσάμπα. Αν δεν θέλεις να το αγοράσεις, απλά διάβασε το online.
Νομίζω ότι δεν είναι η καλύτερη τακτική να κρίνεις ένα βιβλίο επειδή κάποιες εκδόσεις του δεν είναι τσάμπα.
Και το Patterns είναι όντως άλλο βιβλίο.
Παναγιώτης Καναβός, Freelancer Twitter: http://www.twitter.com/pkanavos
|
|
-
29-05-2012, 23:37
|
|
Bill :Χεχε δεν την εγκατέλειψα (Η HOL φταιει) είδα με PLINQ παράδειγμα όπως αναφέρεις... αλλά ακόμη ψάχνω να καταλάβω. Απλά έχω δει σε MPI map reduce και με την TPL ήθελα να δω τι μπορώ να κάνω .
Το MPI ταιριάζει περισσότερο στη λογική του Dataflow και των agents. Εϊναι κι αυτό άλλη μία τεχνική, η οποία κυρίως εφαρμόζεται όταν έχεις πραγματικά πολλούς επεξεργαστές, ή/και ασύμμετρες αρχιτεκτονικές όπως NUMA. Σε τέτοιες περιπτώσεις κάθε επεξεργαστής έχει ταχύτερη πρόσβαση σε ένα μέρος της μνήμης και αργότερη στην υπόλοιπη. Εκεί έχει νόημα το κάθε processing block να μιλάει με τα άλλα μέσω μηνυμάτων και μόνο. Το TPL δεν εκμεταλλεύεται ούτε καταλαβαίνει αυτές τις αρχιτεκτονικές, καθώς πρόκειται για ένα γενικό μηχανισμό να επεξεργαστεί δεδομένα παράλληλα.
Παναγιώτης Καναβός, Freelancer Twitter: http://www.twitter.com/pkanavos
|
|
-
29-05-2012, 23:43
|
|
Bill :Βρήκα το παρακάτω παράδειγμα σε PLINQ για map / reduce κάτι απλό :
Οκ με το map το reduce query είναι σωστό ??? και γιατί είναι τόσο αργό ?
Το παράδειγμα είναι πολύ μικρό για να δεις επιτάχυνση από την παράλληλη επεξεργασία. Επιπλέον, το parallel processing έχει το δικό του overhead. Σε τόσο μικρό δείγμα το overhead είναι πολύ μεγαλύτερο από τον καθαρό χρόνο επεξεργασίας.
Επιπλέον, το PLINQ ελέγχει τον όγκο των δεδομένων και τον αριθμό των cores και μπορεί να αποφασίσει να χρησιμοποιήσει μόνο 1 core αν κρίνει ότι το overhead είναι πολύ μεγάλο. Στο .NET 4.0 ο αλγόριθμος που επιλέγει τα cores είναι συντηρητικός ενώ στο 4.5 επιτρέπει την παράλληλη επεξεργασία σε πολύ περισσότερες περιπτώσεις.
Παναγιώτης Καναβός, Freelancer Twitter: http://www.twitter.com/pkanavos
|
|
-
30-05-2012, 13:38
|
|
Markos:Εντελώς ενημερωτικά, έπεσα πάνω σε ένα paper (κάτι που δε συμβαίνει και τόσο συχνά): Implementing parallel algorithms of MapReduceΔεν ξέρω αν τα αποτελέσματα είναι χαρακτηριστικά, αλλά τα threads φαίνεται να κερδίζουν, ενώ η F# εμφανίζεται ως η πιο αργή.
Διαβάζοντας το paper βλέπω τον πραγματικό κώδικα να λάμπει δια της απουσίας του: δεν υπάρχει πουθενά ο κώδικας των map, reduce. Ο κώδικας που δίνεται είναι μόνο το scaffolding. Είναι απλά αδύνατον να βγάλεις συμπέρασμα κοιτώντας το scaffolding.
Και το χειρότερο, η χρήση ενός Duo σημαίνει ότι δεν υπάρχει καμμία ένδειξη για το πως κάνει scale η κάθε υλοποίηση. Το MapReduce δεν φτιάχτηκε για 2 επεξεργαστές αλλά για να εκμεταλλεύεται όσο περισσότερους επεξεργαστές γίνεται. Και μόνο η χρήση locks στην υλοποίηση με C++ και OpenMP σημαίνει ότι το scale είναι κακό. Το ότι τρέχει μέσα στο ίδιο thread και το map και το reduce, σημαίνει απλά ότι η υλοποίηση ΔΕΝ είναι map reduce.
Όσο για τη χρήση ενός απλού Parallel.For στην υλοποίηση για TPL, μαζί με LOCK για να γράψει σε ένα dictionary .... εντάξει ο τύπος δεν ξέρει από TPL και μιλάει. Τί να πω. Προφανώς δεν άκουσε ποτέ για concurrent collections ή για άλλα πιο χρήσιμα primitives όπως η Interlocked.Increment.
Παναγιώτης Καναβός, Freelancer Twitter: http://www.twitter.com/pkanavos
|
|
-
30-05-2012, 13:48
|
-
30-05-2012, 13:59
|
|
Έριξα μόλις τώρα μία ματιά στο project που αναφέρει στο codeplex, και βρήκα την φοβερή SumThreadResult που απαιτεί locks. Ο λόγος που το κάνει αυτό είναι επειδή εκεί μέσα φτιάχνει ένα dictionary που πάει και το αποθηκεύει στην θέση που βρισκόταν πριν ένα άλλο dictionary. To lock, του lock
Παναγιώτης Καναβός, Freelancer Twitter: http://www.twitter.com/pkanavos
|
|
-
30-05-2012, 18:57
|
-
Markos
-
-

-
Μέλος από τις 26-10-2008
-
Αθήνα
-
Δημοσιεύσεις 874
-
-
|
Στα "Acknowledgements" αναφέρει ότι η συγκεκριμένη έρευνα, καθώς και το "Parallel Dwarfs" project, χρηματοδοτήθηκαν εν μέρει από τη Microsoft. Μόλις τώρα είδα ότι το Parallel Dwarfs project είναι ανεβασμένο στο Codeplex, οπότε μπορεί κάποιος ελεύθερα να το μελετήσει. Μου φαίνεται, λοιπόν, λίγο τραβηγμένο τα αποτελέσματα να είναι μεροληπτικά. Βέβαια, ποτέ δε μπορείς να αποκλείσεις την ύπαρξη σφαλμάτων. Πάντως η έρευνα δείχνει να έχει σταματήσει στο 2009.... ΥΓ: Δε σκοπεύω ν' ασχοληθώ μαζί του, τουλάχιστον στην παρούσα συγκυρία.
Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
|
|
-
30-05-2012, 23:48
|
-
Bill
-
-

-
Μέλος από τις 09-11-2006
-
Greece
-
Δημοσιεύσεις 244
-
-
|
Έχω ψάξει και έχω δει το ActionBlock απο τα DataFlow που λες τα οποία είναι πολυ ελκυστικά αν όντως έχουν καλά αποτελεσμα . Αλλά έχω χαθεί ένα απλό παράδειγμα που να τα δένεις όλα αυτά και με το BufferBlock στο τέλος θα με βοηθούσε αρκετά να το αποσαφηνίσω. Ψάχνω στο google και δε βρίσκω κάτι με όλα τα καλούδια αυτά...!! Ζητάω πολλά ε  Υ.Γ και στην Bing τίποτε..
select DATEDIFF(dd,GetDate(),'20140731') AS EΠΟΜΕΝΕΣ_ΔΙΑΚΟΠΕΣ
|
|
-
30-05-2012, 23:58
|
Σελίδα 1 από 2 (18 εγγραφές)
1
|
|
|