0etvfplosnq8zqvym.jpeg

¿Qué tan fácil es la transición de Python a Rust?

Foto por Diego García en desempaquetar

A veces, es necesario mostrar grandes cantidades de datos en un mapa interactivo y al mismo tiempo mantenerlo utilizable y responsivo. Los mapas interactivos en línea se implementan en HTML y agregar muchos elementos visuales a la visualización del mapa generalmente degrada el rendimiento y la usabilidad. Una posible alternativa es dibujar todos los elementos fuera de línea y mostrarlos sobre el mapa como una capa transparente usando mosaicos. Cada mosaico cuadrado se superpone perfectamente a los mosaicos del mapa y el control del mapa interactivo maneja muchos menos elementos visuales.

Abordé este problema hace unos años escribiendo un generador de mosaicos de mapas personalizado usando Python y datos del Conjunto de datos de energía del vehículo. Este proyecto ilustró cómo mostrar cantidades masivas de información en un mapa interactivo en línea mediante el uso de capas de mosaicos personalizados sobre el mapa. El proceso implica el uso de una aplicación web que genera, almacena en caché y sirve los mosaicos.

Como sabe, Python no es rápido, por lo que el rendimiento se ve afectado significativamente mientras la aplicación web genera cada mosaico. Cuando un mosaico se almacena en caché, el proceso de publicación es rápido y no se nota al interactuar con el mapa.

Aún así, no estaba satisfecho con el rendimiento, por lo que quería resolver el problema nuevamente mejorando drásticamente la velocidad de ejecución del código. Al principio, pensé en convertir el código base a citopero luego mi atención se desvió hacia otro candidato.

El lenguaje de programación Rust ha estado en mi radar desde hace bastante tiempo. Con experiencia en C, C++ y C#, me intrigó la promesa del lenguaje de seguridad de la memoria y rendimiento similar al de C. Finalmente decidí intentarlo y este problema parecía un punto de partida perfecto para aprender y ejercitar el idioma.

Después de revisar muchos videos de YouTube y material escrito diverso, comencé a usar Rust para abordar este problema. Tenía tres preguntas principales: ¿Qué tan difícil es crear una aplicación web, acceder SQLite datos y crear mediante programación una imagen PNG transparente? Afortunadamente, las respuestas a estas preguntas fueron más sencillas de lo previsto.

Cohete

Para responder a la pregunta sobre la aplicación web, recurrí a Cohete. El Empezando La página de la documentación en línea de Rocket muestra lo fácil que es configurar una aplicación web básica. Seguramente necesitaremos más complejidad para construir nuestro servidor de mosaicos, pero el texto estándar parece mínimo y sencillo. Y resultó que Rocket es muy fácil de usar y adaptar. Es un guardián para mí.

sqlx

Después de unos minutos en línea, rápidamente me di cuenta de que la respuesta más popular para acceder a bases de datos SQLite era a través del sqlx paquete. Presenta un paradigma diferente al que usé en Python pero mucho más cercano al que usé en mi vida anterior cuando desarrollé en C#. En lugar de estructuras de datos genéricas o pandas Marcos de datos, aquí debe utilizar estructuras de datos fuertemente tipadas. Aunque es un poco más laborioso trabajar con ellos, aportarán una capa extra de cordura a tu vida.

Figura 1 A continuación se muestra el primer ejemplo de código completo que utilicé para recuperar los datos de la tabla de rango de niveles.

Figura 1 — Código de muestra para recuperar la tabla de rangos de niveles. (Fuente de la imagen: Autor)

PNG

Crear, dibujar y guardar archivos PNG usando el imagen La caja es fácil. El código para crear un mosaico transparente es bastante simple:

Figura 2 – El imagen crate simplifica la manipulación de imágenes. El código anterior muestra cómo crear un mosaico de mapa de 256×256 de color sólido. (Fuente de la imagen: Autor)

También usé el graduación de color paquete para manejar el degradado de color de los mosaicos.

Antes de analizar el código en detalle, revisemos el principio detrás del dibujo de los mosaicos de densidad de tráfico.

Los mosaicos de mapas suelen consistir en mapas de bits cuadrados de 256×256. Podemos abordar cada mosaico combinando X y y coordenadas, un nivel de “zoom” o un cuádruple código. A cada nivel de zoom corresponde un mosaico cuadrado de mosaicos de diferentes dimensiones. Toda la Tierra está representada en un solo mosaico en el nivel superior. Al hacer zoom, el mosaico original se divide en cuatro mosaicos. La siguiente Figuras 2 y 3 ilustrar el proceso de acercamiento.

figura 3 — El mundo entero en un solo mosaico con nivel de zoom 0. (Fuente de la imagen: OpenStreetMap)
Figura 4 — Al hacer zoom en el mosaico anterior, obtenemos cuatro mosaicos con la misma dimensión individual. (Fuente de la imagen: OpenStreetMap)

Si seguimos acercándonos, y después de ocho iteraciones, cada mosaico resultante corresponde a un píxel del primer mosaico. Esta observación es la información que nos permite calcular y mostrar la información de densidad de tráfico en los mosaicos.

Como se describe en el Artículo anterior, la información del mosaico se prepara y almacena en una base de datos. Consulte ese artículo para obtener instrucciones sobre cómo generar la base de datos de densidad a partir del Conjunto de datos de energía del vehículo.

Ahora podemos analizar el código del servidor Rust para generar, almacenar en caché y servir mosaicos. La presente solución sigue de cerca el diseño anterior del servidor de mosaicos. Figura 5 A continuación se muestra el punto de entrada principal que decide si se proporciona un mosaico pintado o uno transparente predeterminado después de analizar y aceptar los parámetros de consulta.

Figura 5 — El principal punto de entrada. (Fuente de la imagen: Autor)

Como puede ver, el servidor responde únicamente a niveles de zoom que van del uno al dieciocho. Esta limitación se incluyó en el proceso de generación de datos para la base de datos de densidad.

La aplicación web dibuja cada mosaico usando la función enumerada en Figura 6 abajo.

Figura 6 — La función anterior genera el mosaico, si aún no está almacenado en caché en el disco, y devuelve el nombre del archivo del mosaico. (Fuente de la imagen: Autor)

Como puede ver en la lista anterior, el proceso de pintura de azulejos tiene tres pasos. Primero, en la línea 12, recopilamos la información de densidad por píxel del mosaico. A continuación, recuperamos el rango de nivel del mosaico, es decir, los niveles de densidad mínimo y máximo para el nivel de “zoom” del mosaico. Finalmente, en la línea 14, pintamos el mapa de bits del mosaico. La función finaliza guardando el mapa de bits del mosaico en la memoria caché del archivo.

Figura 7 — La función anterior pinta un solo mosaico en un mapa de bits. Observe cómo la información de densidad se transforma en una entrada del degradado de color mediante una transformación basada en logarítmica. (Fuente de la imagen: Autor)

Después de configurar correctamente la ruta del archivo de la base de datos, inicia el servidor de mosaicos abriendo una ventana de terminal, cambiando al directorio del proyecto Rust y ejecutando el siguiente comando:

cargo run --release

A continuación, puede abrir el cliente de mapas y configurar el URI de la capa de mosaicos de densidad. Figura 8 A continuación se muestra la celda de código de Jupyter Notebook para cargar el mapa interactivo:

Figura 8 — Utilice el código anterior para mostrar el mapa de Ann Arbor con los mosaicos de densidad superpuestos. (Fuente de la imagen: Autor)

¡Y eso es! Figura 9 A continuación se muestra el resultado.

Figura 9 — La imagen de arriba muestra el mapa base con los mosaicos de densidad de tráfico superpuestos. (Fuente de la imagen: OpenStreetMap y mosaicos generados por el autor)

Mi primera incursión en Rust no fue tan difícil como esperaba. Comencé sumergiéndome en la literatura disponible y los videos de YouTube antes de intentarlo. A continuación, me aseguré de contar con ayuda de un excelente IDE de JetBrains: RustRover. Aunque todavía está en modo de vista previa, encontré este IDE útil e instructivo al usar Rust. Aún así, también estarás perfectamente bien si lo prefieres. Código de estudio visual. Solo asegúrate de obtener los complementos autorizados.

solía gramaticalmente revisar el escrito y aceptó varias de sus sugerencias de reescritura.

La IA de JetBrains El asistente escribió parte del código y también lo usé para aprender Rust. Se ha convertido en un elemento básico de mi trabajo diario tanto con Rust como con Python.

El conjunto de datos de energía de vehículos extendidos tiene licencia Apache 2.0, al igual que su creador, el Conjunto de datos de energía del vehículo.

Conjunto de datos de energía del vehículo (GitHub)

repositorio de GitHub