Developpez.com - Rubrique JavaScript

Le Club des Développeurs et IT Pro

Tutoriel pour implémenter un algorithme de MapReduce en JavaScript classique et ES6

Par Marc Autran

Le 2016-09-15 18:10:59, par autran, Rédacteur
Bonjour à tous,

Je vous propose un tutoriel pour apprendre à implémenter un algorithme de MapReduce avec la technologie JavaScript. Il s'agit d'un cas d'école qui offre un aperçu de ce que l'on peut faire avec ce langage dans le domaine du Big Data.

Implémentation d'un algorithme de MapReduce en JavaScript classique et ES6

Merci de laisser vos commentaires !

Retrouvez tous nos cours et tutoriels pour apprendre le JavaScript !
  Discussion forum
4 commentaires
  • danielhagnoul
    Rédacteur


    Hier soir, j'ai publié un billet de blog utilisant ta version ES2015 de cet algorithme : kNombreMots() retourne le nombre de mots et, dans l'ordre alphabétique, le nombre de chaque mot
  • autran
    Rédacteur
    Bien vu Daniel !!!

    Je vais creuser ton blog, ça m'a l'air passionnant.
    A bientôt sur l'un de tes fils.

    Marc
  • bvdig
    Candidat au Club
    Bonjour à tous,

    Voici mon implémentation avec un peu de retard

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     countWords = str => {
      const arr = str.split(' ')
    
      const obj = arr.sort().reduce((acc, word, index) => {
        if (word !== 'se') acc[word] = ++acc[word] || 1
        return acc
      }, {})
    
      return Object.entries(obj)
    }
    
    console.log(countWords('voiture la le elle de elle la se la maison voiture'))
    //[['de', 1], ['elle', 2], ['la', 3], ['le', 1], ['maison', 1], ['voiture', 2]]
    Merci pour vos commentaires.

    Bonne journée

    Benjamin
  • Loralina
    Membre éclairé
    Bonjour,
    Envoyé par bvdig 
    Merci pour vos commentaires.

    C'est intéressant.
    J'ai réfléchi à quelques optimisations sur la vitesse d'exécution :
    1) ++acc[word] est à remplacer par acc[word]+1.
    2) J'observe un traitement plus rapide en remplaçant Object.entries par une construction plus explicite du tableau (mais on perd en concision du code, à voir ce que l'on privilégie).
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    const countWords2 = str => { 
    	const obj = str.split(' ').sort().reduce((acc, word) => { 
    		if (word !== 'se') { 
    			acc[word] = acc[word]+1 || 1; 
    		} 
    		return acc; 
    	}, {}); 
    	const arr = []; 
    	for(const i in obj) { 
    		arr[arr.length] = [i, obj[i]]; 
    	} 
    	return arr; 
    };
    3) Pour alléger le tri, je pense qu'il serait préférable de le faire à la fin (la différence sera appréciable à partir d'un certain nombre de répétitions des mots).
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    const countWords3 = str => { 
    	const arr = []; 
    	const obj = str.split(' ').reduce((acc, word) => { 
    		if (word !== 'se') { 
    			if (acc[word] !== undefined) { 
    				acc[word]++; 
    			} 
    			else { 
    				acc[word]=1; 
    				arr[arr.length]=word; 
    			} 
    		} 
    		return acc; 
    	}, {}); 
    	arr.sort(); 
    	for(let i=arr.length-1 ; i>=0 ; i--) { 
    		arr[i] = [arr[i], obj[arr[i]]]; 
    	} 
    	return arr; 
    };
    Enfin, je pense qu'on pourrait gagner encore un peu en remplaçant reduce par une simple boucle.