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.
Cargando últimos commits…
Pruebas
476
Paralelo (crxml)
7,63 GB/s
Documentación
15,9K líneas
Publicado
PyPI + crates.io
¿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.
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.
¿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.
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.
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
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.
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.
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