Buscar temas sin respuesta | Ver temas activos |

Nuevo tema Responder al tema Índice general » Programación: lo ultimo » QA / Performance testing / escalabiliad Ir a página 1, 2  Siguiente
Autor Mensaje
Desconectado 
 Asunto: Por qué debería importarme Map/Reduce?
NotaPublicado: 05 Feb 2008 11:29 
BOFH
Avatar de Usuario

Registrado: 21 Mar 2002 01:19
Mensajes: 5994
En este artículo, se explica la tecnologia detrás del engine de Google.
MapReduce: Simplified Data Processing on Large Clusters
http://www.theserverside.com/tt/knowled ... =MapReduce

_________________
“Hay que cuidarse de ese diario, ataca como partido político y, si uno le contesta, se defiende con la libertad de prensa”.


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 09 Jul 2008 10:45 
root@pcmasmas:~#
Avatar de Usuario

Registrado: 31 Dic 1969 21:00
Mensajes: 24775
Ubicación: London [uK]
son dos partes !

http://www.theserverside.com/tt/knowled ... =MapReduce
http://www.theserverside.com/tt/article ... educeRedux

Excelente documento

tambien hay nuevas herramientas como Hadoop que ofrecen implementaciones de MapReduce

ice

_________________
"Imagination is more important than knowledge" -- Albert Einstein


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 09 Jul 2008 12:13 
I am the Architect
Avatar de Usuario

Registrado: 16 Nov 2002 04:09
Mensajes: 8866
El verdadero origen de todo esto está en LISP ;) De ahí vienen sus nombres.

MAP y REDUCE son funciones de orden superior.

MAP básicamente lo que hace es tomar una lista y aplicarle una función a cada uno de los elementos y REDUCE le aplica una operación binaria para combinar los elementos.

Programación sin efectos colaterales -> fácil paralelización.

Código:
> (map 'list #'cos '(5 6 2 23 7 8))
(0.2836622 0.96017027 -0.41614684 -0.53283304 0.75390226 -0.14550003)
> (reduce #'+ '(1 2 3 4))
10

_________________
02 00 00 00 0C 00 01 02 2E 00 00 00


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 09 Jul 2008 12:29 
root@pcmasmas:~#
Avatar de Usuario

Registrado: 31 Dic 1969 21:00
Mensajes: 24775
Ubicación: London [uK]
djgera escribió:
Imagen


eh voh, no te desacateh ! que Java es el precursor de todo !

buena data :D

me explicas la sintaxis de lo que hicistes ahi?


Código:
> (map 'list #'cos '(5 6 2 23 7 8))
(0.2836622 0.96017027 -0.41614684 -0.53283304 0.75390226 -0.14550003)
> (reduce #'+ '(1 2 3 4))
10



no me queda muy claro el " 'list #' " ni el " #'+ ' "

_________________
"Imagination is more important than knowledge" -- Albert Einstein


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 09 Jul 2008 12:47 
Avatar de Usuario

Registrado: 15 May 2002 15:09
Mensajes: 19541
el ' hace que lo uqe le sigue no lo evalue y lo tome como viene, es decir, una lista le va a aplicar un coseno. El # no sé que hace.

_________________
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 09 Jul 2008 12:54 
I am the Architect
Avatar de Usuario

Registrado: 16 Nov 2002 04:09
Mensajes: 8866
jaja :P

La función map es (map tipo-de-retorno función-a-aplicar lista1..lista2)

cuando llamas a un función y el parámetro es una función se usa esa notación #'+ #'cos #'mi-funcion #'(lambda (x) ....)

el 'algo es igual a (quote algo) eso hace que no se evalúe

y reduce (reduce función-a-aplicar lista)

por decirlo de alguna forma map hizo:

Código:
(list (cos 5) (cos 6) ... (cos 8))


mientras que reduce:

Código:
(+ (+ (+ 1 2) 3) 4)


map como está arriba se le pueden pasar N listas mientras la función reciba N argumentos. ejemplo:

Código:
(map 'vector #'< '(9 8 7 6 5 4 3 2 1) '(1 2 3 4 5 6 7 8 9))
#(NIL NIL NIL NIL NIL T T T T)


Código:
(map 'list #'(lambda (x y) (if (> x y) 'hola 'viteh)) '(9 8 7 6 5 4 3 2 1) '(1 2 3 4 5 6 7 8 9))
(HOLA HOLA HOLA HOLA VITEH VITEH VITEH VITEH VITEH)

_________________
02 00 00 00 0C 00 01 02 2E 00 00 00


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 09 Jul 2008 13:12 
root@pcmasmas:~#
Avatar de Usuario

Registrado: 31 Dic 1969 21:00
Mensajes: 24775
Ubicación: London [uK]
tendrias que postearte algunos buenos tutoriales para LISP beginners

ice

_________________
"Imagination is more important than knowledge" -- Albert Einstein


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 09 Jul 2008 13:15 
Avatar de Usuario

Registrado: 15 May 2002 15:09
Mensajes: 19541
yo estoy aprendiendo lisp con sawfish

_________________
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 09 Jul 2008 13:16 
I am the Architect
Avatar de Usuario

Registrado: 16 Nov 2002 04:09
Mensajes: 8866
hielito escribió:
tendrias que postearte algunos buenos tutoriales para LISP beginners

ice


ooohhh sí :D

jeje el lunes me re enganche y le dí un curso básico de LISP en dos horas y media a RPM por MSN :P

_________________
02 00 00 00 0C 00 01 02 2E 00 00 00


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 09 Jul 2008 14:18 
I am the Architect
Avatar de Usuario

Registrado: 16 Nov 2002 04:09
Mensajes: 8866
¿Tuve un deja-vú? jajaja viewtopic.php?t=13125

_________________
02 00 00 00 0C 00 01 02 2E 00 00 00


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 09 Jul 2008 15:10 
BOFH
Avatar de Usuario

Registrado: 21 Mar 2002 01:19
Mensajes: 5994
La verdad que eso seria genial man

Posta

_________________
“Hay que cuidarse de ese diario, ataca como partido político y, si uno le contesta, se defiende con la libertad de prensa”.


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 09 Jul 2008 15:27 
root@pcmasmas:~#
Avatar de Usuario

Registrado: 31 Dic 1969 21:00
Mensajes: 24775
Ubicación: London [uK]
dale gera, hacete un cursito.

pone ejercicios y das un tiempo para postear el resultado (enviados a vos por mail) y al terminar el tiempo, posteas todos los envios y el resultado esperado

eh? :D

ice

_________________
"Imagination is more important than knowledge" -- Albert Einstein


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 09 Jul 2008 20:20 
I am the Architect
Avatar de Usuario

Registrado: 16 Nov 2002 04:09
Mensajes: 8866
Bárbaro :) Si se copan joya :) y sino también :P

_________________
02 00 00 00 0C 00 01 02 2E 00 00 00


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 09 Jul 2008 21:47 
poster a 1 tbps
Avatar de Usuario

Registrado: 12 Ene 2004 13:15
Mensajes: 1583
Ubicación: localhost
Map, Filter y Reduce en Python (porque no solo Lisp tiene alto orden)

Estas son las funciones "paradigmáticas" de alto orden. Se las llama así porque toman como parámetro una función, para lo cual es necesario que las funciones sean objetos de primer orden en el lenguaje.

Map aplica la función a todos los elementos de la lista.
Filter crea una nueva lista con los elementos para los cuales evaluar la función da verdadero.
Reduce es menos intuitivo :) Ahora se va a ver.

Código:
>>> numeros = range(10)
>>> numeros
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> def esPar(x): return x % 2 == 0
...
>>> def alCuadrado(x): return x ** 2
...
>>> def suma(a,b): return a + b
...
>>> alCuadrado
<function alCuadrado at 0xb7d24374>
>>> esPar
<function esPar at 0xb7d2433c>


Las versiones funcionales en Python tienen también sus versiones de "lista por comprensión", que suelen ser más intuitivas y lindas de usar.

Código:
>>> map(alCuadrado, numeros)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> [alCuadrado(x) for x in numeros]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

>>> filter(esPar, numeros)
[0, 2, 4, 6, 8]
>>> [x for x in numeros if esPar(x)]
[0, 2, 4, 6, 8]

>>> filter(esPar, map(alCuadrado, numeros))
[0, 4, 16, 36, 64]
>>> [x for x in [alCuadrado(n) for n in numeros] if esPar(x)]
[0, 4, 16, 36, 64]

>>> reduce(suma, numeros)
45
>>> buf = 0
>>> for n in numeros:
...     buf += n
...
>>> buf
45



Lo bueno de que las funciones "mapeadas" o "filtradas" no tengan efectos secundarios (o sea, no hagan nada más que crear la lista que devuelven) es que paralelizar es una pavada, como decía gera - al hacer map de una función si se tiene más de un procesador se puede ejecutar la función en paralelo.

En el caso de reduce es menos trivial, la ejecución en paralelo "obvia" solo funciona cuando la función que se aplica es asociativa (o sea f(f(a,b),c) = f(a, f(b,c)), como es el caso con la suma o el producto). Esto no siempre ocurre, pero cuando es así se puede dividir la lista a reducir a varias partes y al terminar de reducir cada una, crear una nueva lista con los nuevos valores y reducir cada mitad.

Código:
>>> def resta(x,y): return x-y # La resta no es asociativa!
...
>>> num1 = numeros[:5]
>>> num1
[0, 1, 2, 3, 4]
>>> num2 = numeros[5:]
>>> num2
[5, 6, 7, 8, 9]
>>> num1 + num2 == numeros
True

>>> reducidos = [reduce(suma, num1) , reduce(suma, num2)]
>>> reduce(suma, reducidos)
45
>>> reduce(suma, numeros) # Da lo mismo!
45

>>> reducidos = [reduce(resta, num1), reduce(resta, num2)]
>>> reduce(resta, reducidos)
15
>>> reduce(resta, numeros)
-45


Más allá de la elegancia, las versiones por comprensión son más expresivas que map y filter. Reduce no tiene una versión por comprensión porque es una primitiva menos "simple". Por esta razón es muy probable que Python 3000 no tenga más reduce, ya que en la mayoría de los casos es más sencillo (y siempre es más explícito) usar el buclecito como hice arriba.

Esto fue programación funcional en Python, espero que les haya gustado.

Saludos ;)


Arriba
 Perfil  
 
Desconectado 
 Asunto:
NotaPublicado: 09 Jul 2008 22:30 
I am the Architect
Avatar de Usuario

Registrado: 16 Nov 2002 04:09
Mensajes: 8866
uff que feliz que fui cuando había descubierto eso en Python :) (lista por comprensión)

Me venia justo para generar rangos de números y letras bajo ciertas condiciones de forma muy rápida. :)

Ahora falta Rorra con Ruby :)

_________________
02 00 00 00 0C 00 01 02 2E 00 00 00


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 19 mensajes ]  Ir a página 1, 2  Siguiente


  Imprimir vista Tema previo | Siguiente tema 

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados


Todos los horarios son UTC - 3 horas


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Buscar:
Saltar a:  
cron
PC++ Style
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë