Muchas lecturas aleatorias y secuenciales, ¿mmap?

Con Guillo y Alecu empezamos a charlar sobre si, en un módulo que estaba haciendo Guillo para el laburo convenía usar mmap al tener muchas lecturas secuenciales y muchas lecturas aletorias sobre un archivo grande. Obviamente, usando Python (¿faltaba aclararlo?).

Como no nos decidíamos, decidí medirlo.

Medimos!

Creé un archivo de cien millones de bytes al azar, y probé con distintos scripts hechos en el momento, con un comportamiento parecido al que iba a hacer Guillo:

  • Una lectura secuencial de todo el archivo, de a dos tamaños diferentes. En el script leo 50 bytes, y luego 450 bytes, y así; en la realidad se haría una lectura de ~50 bytes, longitud fija, y luego una de ~450, longitud variable.
  • Doscientas mil lecturas al azar en todo el archivo, siempre de 450 bytes. En la realidad, se harían muchas lecturas, de un valor no fijo pero precalculado.

En ambos casos, las pruebas que realicé fueron haciendo .read() y .seek() sobre archivos normales, haciendo .read() y .seek() sobre el mmap, y usando el mmap como un string, accediendo por slices.

Resultados

Entonces, lectura secuencial, leyendo los cien megabytes de principio a fin (en milisegundos):

- .read() y seek() sobre el file: 501 mseg
- .read() y seek() sobre el mmap: 492 mseg
- usando slices sobre el mmap:    169 mseg

Es notable la diferencia.

Hay que tener en cuenta que los primeros dos hacen dos llamadas a función por cada vuelta del loop (vean los archivos para más detalle), lo que suma 400 mil function calls en total. Yo había medido antes el costo de una llamada a función, y eran de un poco menos de 250 nanogundos: no parece mucho, pero en 400 mil llamadas, suman 100 milisegundos, lo que explica un poco la diferencia en lo medido.

En la lectura secuencial, tiempo total desde que se tiene la posición a leer hasta que se obtiene el string (en microsegundos):

- .read() y seek() sobre el file: 18.1 useg
- .read() y seek() sobre el mmap: 10.8 useg
- usando slices sobre el mmap:    10.3 useg

Conclusiones

Si vamos a usar mmap, en estos casos, conviene usar el acceso por slices (con corchetes).

Tomando esos tiempos, mmap es un 296% más rápido en la lectura secuencial, y un 75% más rápido en el acceso aleatorio.

Claramente mmap es el ganador.

Disclaimers

Uno: Esto lo hice usando Python 2.6.6 en un Linux.

Dos: Mi disco es un SSD, seguramente en un disco con platos magnéticos la diferencia entre acceso secuencial y acceso aleatorio sea mayor.

Tres: Inmediatamente antes de hacer cada prueba, hay que decirle al sistema operativo que descarte los caches del filesystem, para que esto no nos deforme las medidas. Eso lo hice con este script.

Comentarios Imprimir

Cerrando el año con todo

Bueno, casi. Estamos terminando Noviembre, pero venimos muy acelerados.

Por suerte casi se terminó la "época de conferencias". Dos PyCon en Octubre y Jornadas en Junín en Noviembre me sacaron bastante tiempo. Pero también tuve un viaje de capacitación a Orlando de una semana, y tengo un sprint la semana que viene (por suerte en Buenos Aires). Ah, y veníamos casi sábado por medio con las Charlas Abiertas en La Tribu...

Mañana está Fábrica de Fallas, y el domingo viene gente a casa, hago asado para quince. Por suerte hoy puedo relajarme un poquito, ¿no? No, a las seis me rajo para La Plata al evento de cierre del postgrado de computación para científicos en el que vengo mostrando Python los últimos dos años.

Pero bueno, calavera no chilla y chancho limpio nunca engorda (?).

Por otro lado, la familia muy bien, ví a mi padre, madre y hermana esta semana, Felu sigue creciendo maravillosamente, y con Moni estamos terminando de terminar los arreglos iniciales de la casa para terminar de mudarnos (sí, nos mudamos hace dos meses, pero todavía no terminamos).

Tengo a todos mis proyectos open source casi en hold, ya retomarán momento cuando termine de cerrar el año.

Bueno, los dejo que me tengo que ir a bañar, recién llegué de tenis (hermoso día de 33°C con un sol bárbaro).

Comentarios Imprimir

Vuelta a Taniquetil

¿Qué? ¿Me fuí? No, ¡me fueron!

Bueno, casi.

Resulta que nic.ar te hace renovar el nombre (en mi caso, taniquetil.com.ar) una vez por año. Normalmente manda mail antes de la fecha límite de renovación, pero esta vez o no lo mandaron, o me dieron de baja los DNSs antes de mandarmelo.

Y encima yo, bien boludo, tenía el mail de contacto bajo este mismo nombre (lo pasé cuando me fuí de Movistar), así que me costó reactivar el nombre.

Pero bueno, ya está. Tengo que pasar el contacto a otra cuenta de correo. Y espero acordarme antes el año que viene :|

Comentarios Imprimir

Sextas Jornadas de Software Libre en Junín

El finde pasado estuve también de conferencia, en dichas jornadas.

Fuimos en mi auto Luciano, Roberto, Fisa y yo. Arrancamos el viernes tempranito y a eso de las dos de la tarde ya estábamos allá, donde fuimos muy bien recibidos. Hicimos el check in, almorzamos, y luego hicimos algo de tiempo (yo hice una micro siesta y me pegué un baño) y finalmente cruzamos la calle hasta la Universidad, donde arrancó el evento.

Yo abrí la conferencia con la charla de Python más rápido que C y luego hubieron algunas más que ya había visto, y una de "Fortificacion en instalaciones de servidores Debian" por Luciano Bello, que estuvo muy bien, súper interesante.

Esa fue la última charla del día (que como había arrancado a la tarde, terminó a las nueve de la noche), así que luego de un rato en el que pasamos apenas por el hotel, nos fuimos a un asado los organizadores y disertantes (los que estábamos allí y un par que cayeron más tarde). El asado estuvo genial, todo muy rico (picada, asado y postres), y el ambiente copadísimo. Hace rato que no me reía tanto en una reunión así.

Ya pasada medianoche emprendimos el regreso caminando (eran unas quince cuadras hasta el hotel), pero media cuadra antes de llegar al mismo vimos un pool abierto, y la tentación fue muy grande: con Nico César nos quedamos como tres horas más jugando y charlando.

Al otro día obviamente me levanté más tarde de lo que hubiese debido, me afeité, bañé, desayuné y llegué a la Universidad para la segunda charla. El segundo día también estuvo interesante, destaco las charlas de Andrés Riancho sobre aspectos de seguridad web, la de Nico César sobre administración de sistemas en gran cantidad de servidores, y otra de Luciano Bello sobre Linux capabilities.

La última charla del evento fue Entendiendo Unicode, luego algunas palabras de los organizadores, un sorteo, fotos, y desbande generalizado.

Con algunos de los chicos nos fuimos a tomar una cerveza, y luego hicimos un rato de tiempo hasta que fuimos a comer, a un club local. Luego al hotel, a dormir tempranito, porque el domingo arrancábamos el viaje de regreso a las ocho y media de la mañana...

La verdad es que la pasé genial el fin de semana. No sólo porque el evento en sí estuvo bárbaro (casi todas las charlas me resultaron interesantes, y estuvo bien organizado), sino que me volví a ver a un grupo de gente con el que me llevo muy bien. Es notable la dinámica que se logra en estas conferencias, porque hay un montón de gente de todo el país que si no fuese por estos eventos no nos veríamos (¡ni nos hubiésemos conocido!) y nos vamos reencontrando algunas veces al año en distintos puntos de nuestra geografía.

Es un lujo poder participar en esto.

Comentarios Imprimir

Conferencias Python Cono Sur 2010

Una atrás de la otra, pasaron más rápido de lo que hubiese querido.

En Córdoba estuve un par de días antes de la conferencia, incluso un día trabajando desde allá (el otro ayudando un poco). Pero igual me fui con la sensación de que me faltó charlar con un montón de gente. Quizás estoy mal acostumbrado por los PyCamp, donde son cuatro días no tan estructurados como en una conferencia, y uno puede lograr un mayor contacto humano.

Como conté, dí dos charlas, las cuales salieron bien. Las Charlas Relámpago estuvieron geniales, los keynotes no tanto. Los dos días luego de la conferencia estuvieron buenos (el viernes hubo un asado que no fue asado, lejos de la ciudad, y el sábado una cerveceada, en un bar copado a unas cuadras de la Uni).

Cerveceada cordobesa

¿Cómo es un asado que no es asado? Originalmente iba a ser asado, pero terminó siendo algo que parece estar muy de moda en Córdoba: "pata". Con el término "pata" se refieren a que uno contrata el servicio de una gente que vienen con una pata graaande de ternera, ya cocida, calentita, mucho pan, algunos tarritos con diferentes salsitas, y la cortan ahí "en vivo", y uno mismo se va haciendo sanguchitos. No me quedó claro si el tomate y la lechuga que había la habían puesto los organizadores, o vienen incluidos en el servicio de "pata".

Todas mis fotos de PyCon en Córdoba, acá. Y acá están las de Marcos Dione, fotógrafo (semi?) oficial del evento.

PyCon Brasil fue mucho más express. Como mi keynote fue decidida medio de emergencia, mi vuelo fue medio "como pude". Viajé a Curitiba el jueves a la mañana, vía Montevideo (buenísimo, porque salí de Aeroparque), y llegué allá a media tarde, perdiéndome casi todo el primer día de la conferencia. Una cal y una de arena con respecto al vuelo de Pluna: no te sirven nada a bordo a menos que lo compres, pero los aviones (Bombardier CRJ-900NG) son realmente cómodos.

Me pasaron a buscar por el aeropuerto, me llevaron hasta al hotel donde hice el check-in y dejé algunas cosas, y fuimos a la conferencia. Llegué más o menos justo para las Lightning Talks, y me quedé en la Asamblea de la Asociación de Python Brasil, donde casi no entendí nada de lo que discutían. Casi. Luego, fuimos todos a cenar a una especie de tenedor libre en la que pasean un montón de mozos con distintos cortes de carne y te van sirviendo. Comí muy bien, luego me llevaron hasta el hotel, y al sobre.

Al otro día me levanté no demasiado temprano, desayuné tranqui y me tomé un taxi hasta la Universidad. Estuve un rato con la gente, hasta que a las once y cuarto arrancó una charla donde contaban qué es Arduino, cómo se conecta, un ejemplo de programita en C, y luego cómo usarlo desde Python a través de Firmata.

Luego del almuerzo (algo bien brasileño en un lugar cercano), vino mi keynote. Mi charla sobre Comunidad, anarquía y subversión salió muy bien, pude hilar todos los conceptos que quería, y hacer el remate con el efecto deseado sin que parezca tirado de los pelos. Tuve muy buen feedback, no sólo por algunas preguntas en el momento, sino gente que luego se me acercó. "Motivadora" fue un adjetivo que me gustó.

Luego hubieron un par de charlas más, y llegaron las charlas relámpagos. Yo dí una de las charlitas: Archivos ejecutables de Python, una pequeña receta que ya pondré acá como post, tomada de una charla más larga de John Lenton. Ni bien terminaron me llamé un taxi, y me volví al hotel. Compré algo para comer, y a dormir temprano, que estaba destruido...

PyCon Brasil

El sábado todo fue más tranquilo, yo me desperté tarde, llegué a media mañana, pero vi bastante gente que llegó más tarde que yo. Como había desayunado tarde terminé no almorzando, sino que paseando un poquito por ahí. Presencié la keynote de Ruby, y estuve en un par más pero sin prestar atención casi. Al final del día, volví a presentar una Charla Rápida, esta vez sobre PET (Python Entre Todos, la revista de PyAr), cuya primer edición está siendo traducida al portugués en este momento (ya está en castellano e inglés).

A la noche, fuimos a comer a un lugar de comida árabe. No estaba demasiado ambientado, ni nada, pero era árabe posta (o sea, no era "árabe para turistas", sino "árabe para árabes"). Comí muchas cosas raras. Incluso algunas que al principio no me animé, como carne cruda condimentada (pero no cocinada con limón, por ejemplo...).

El domingo me levanté temprano, y me llevaron a pasear a una feria artesanal, luego a almorzar, y finalmente me alcanzaron hasta el aeropuerto (gracias Ramiro!). El viaje de vuelta todo muy bien, y finalmente pude llegar a casa. Todas las fotos de PyCon Br, acá.

Comentarios Imprimir