03Datos · Marco de ingesta

rypipe

Marco de ingestión reutilizable. Núcleo Rust, bindings de Python. Añade un nuevo formato implementando dos traits.

Los adaptadores siguen siendo pequeños. El motor posee programación, memoria limitada y exportación Arrow.

Rust 1.78+Python 3.10+PyO3Apache Arrowmmap
Último commit del repositorio

Cargando últimos commits…

Pruebas

476

Paralelo (crxml)

7,63 GB/s

Documentación

15,9K líneas

Publicado

PyPI + crates.io

01

¿Qué es rypipe?

rypipe es un marco de ingesta reutilizable, no un analizador de formato único. Separa el análisis específico del formato de la ejecución independiente del formato. Agregue un nuevo formato implementando dos pequeños rasgos: Splitter y RecordParser.

rypipe en sí no incluye analizadores. Estos viven en paquetes de adaptadores separados. Instala el motor más los adaptadores que necesites. El marco maneja la programación paralela, la ejecución limitada a la memoria, la inserción de consultas y una canalización encadenable API.

02

Problema

El análisis de flujos de bytes orientados a filas en formatos de columnas (Apache Arrow) generalmente requiere escribir un motor completo por formato. Cada formato tiene su propio programador paralelo, administrador de memoria e infraestructura de ejecución. El resultado es un esfuerzo duplicado y características de rendimiento inconsistentes en todos los formatos.

03

¿Por qué es difícil?

La dificultad es separar el análisis específico del formato (dos pequeños rasgos) de la ejecución independiente del formato (programación paralela, memoria limitada, envío de consultas, exportación Arrow de copia cero) manteniendo al mismo tiempo el rendimiento en el ancho de banda de la memoria. El conjunto de pruebas de contrato de adaptador verifica que cualquier adaptador produzca resultados idénticos en los modos de ejecución de subproceso único, paralelo y limitado.

04

Rendimiento medido

El rendimiento depende del adaptador y la carga. Últimos benchmarks en un Ryzen 7 5800X: crxml alcanza 4,23 GB/s en RAM completa y 7,63 GB/s en modo acotado con esquema explícito sobre un informe de 533 MB; xmlstreamer-ng alcanza 2,12 GB/s en paralelo (8 hilos) y 1,36 GB/s en paralelo acotado sobre un feed de 128 MiB.

05

Restricciones

  • Memoria limitada: no se pueden cargar archivos completos en RAM
  • La ejecución paralela debe escalar linealmente con los núcleos
  • Las etapas de la tubería deben fusionarse en el bucle de análisis (sin ida y vuelta Python)
  • El adaptador API debe ser mínimo: dos características, no un motor completo
06

Decisiones clave

Modelo de adaptador de dos rasgos

Agregar un nuevo formato requiere implementar Splitter y RecordParser. El motor se encarga de todo lo demás.

Evaluación de predicado primero

Los filtros se introducen en el bucle de análisis Rust. Las filas que fallan se rechazan antes de que se cree cualquier objeto Python.

Predicción de diseño a través de memcmp

Predice la estructura de filas a partir de patrones de bytes, omitiendo el descubrimiento de columnas cuando se conoce el esquema.

Exportación Arrow de copia cero

Los datos se mueven desde los buffers de análisis directamente a las matrices Arrow sin copias intermedias.

07

Origen

rypipe se desarrolló originalmente como motor de ingesta para crxml, un adaptador Crystal Reports XML. El diseño del motor, las características de rendimiento y API fueron moldeados por el uso de producción con crxml. crxml es el adaptador de referencia que demostró el modelo: esquemas anidados complejos, archivos grandes, procesamiento paralelo y filtrado avanzado.

08

Compensaciones

  • Los adaptadores deben escribirse por formato (no un analizador universal)
  • El núcleo Rust agrega complejidad de construcción frente al Python puro
  • El esquema debe conocerse de antemano para obtener el máximo rendimiento