This release has been yanked by its maintainers, and will be ignored by installers, except when explicitly specified.
Consider using release 0.5.1 instead.
rypipe
Format-agnostic data ingestion framework with Rust core and Python bindings.
rypipe is a format- and source-agnostic ingestion framework that provides a common execution runtime for turning arbitrary record-oriented data sources into typed columnar data.
Parse row-oriented byte streams into Apache Arrow record batches with parallel scheduling, memory-bounded execution, query pushdown, and a chainable pipeline API. Format adapters live in separate packages.
What is rypipe
rypipe is a pure ingestion-to-Arrow engine. It separates format-specific
parsing (splitting, row extraction) from format-agnostic execution (typed
column builders, filtering, projection, dictionary encoding, parallel
scheduling, memory-bounded execution, and Arrow export). Add a new format by
implementing two small traits: Splitter and RecordParser.
rypipe itself does not ship parsers for XML, JSON, CSV, HTML, or any
other format. Those live in separate adapter packages. Install the engine plus
the adapters you need.
Note:
crxmlwas the original idea: a fast Crystal Reports XML parser that needed parallel, bounded-memory, and Arrow-native execution. The engine that madecrxmlfast (Splitter+RecordParser+TableBuilder+ExecutionPlan) was then separated and abstracted intorypipeso any format could reuse it.crxmlnow lives as a thin adapter (crxml-core+CrystalXMLSource) on top ofrypipe-core. Seerypipedocs/crxml-adapter.mdfor the3 GB/sevolution.
Why rypipe
-
One runtime, many formats. XML, JSON, CSV, HTML, TSV, and any future format share the same parallel scheduler, memory-bounded executor, Arrow export, and pushdown infrastructure. An adapter is two small traits, not a full engine.
-
Performance without compromise. Single-thread ~1 GB/s, parallel ~4.9 GB/s unprojected, ~6.8-7.0 GB/s with projection. Zero-copy Arrow export. Predicate first evaluation. Layout prediction via memcmp.
-
Correctness by construction. Differential testing against an independent oracle, fuzz targets, property tests, and a tier-ladder profiler that decomposes every nanosecond of the hot path.
-
Python-native ergonomics. Chainable pipeline API with automatic fusion of rename/drop/cast/filter into the Rust parse loop. Streaming with bounded memory. Schema discovery. DataFrame and Parquet sinks.
What rypipe is not
-
Not a query engine. It handles projection, renaming, dropping, casting, filtering, and dictionary encoding. It does not do joins, aggregations, window functions, or SQL.
-
Not a one-size-fits-all parser. Each format needs a
RecordParser+Splitteradapter from a separate package. The engine provides the runtime; you provide the format knowledge. -
Not a data warehouse. It ingests data into Arrow; it does not store it, index it, or serve queries over it.
Features
- Zero-copy friendly: decoders emit borrowed strings; the engine copies only when necessary.
- GIL-free parsing: heavy work runs outside Python's GIL.
- Parallel by default: chunked parsing with
rayonscales to many cores. - Memory bounded: stream files larger than RAM with a configurable budget.
- Typed columns: cast strings to
int64,float64, orboolduring parse. - Pushdown filters: rename, drop, type, and filter rows while parsing.
- Pipeline API: chainable rename/drop/cast/filter stages with automatic fusion.
- Dictionary encoding: explicit or automatic low-cardinality encoding.
- Arrow native: produces
RecordBatchand exports via the C Data Interface.
Crates
| Crate | Purpose |
|---|---|
rypipe-core |
Pure Rust engine: Value, ExecutionPlan, TableBuilder, ColumnarSink, RecordParser, Splitter, Pipeline, parallel/bounded drivers, Arrow export |
rypipe-python |
PyO3 bindings and helper functions for adapter packages; exposes the rypipe package |
Python quick start
pip install rypipe my-adapter
Wheels are built against CPython's stable ABI (abi3, 3.10+), so one wheel per
platform covers every supported interpreter, including versions released after
a given rypipe release. Prebuilt wheels ship for manylinux (glibc 2.17+),
musllinux, macOS (x86_64 and arm64), and Windows x64; anything else builds from
the sdist and needs a Rust toolchain.
Optional DataFrame sinks pull their own dependencies:
pip install "rypipe[pandas]" # to_pandas / to_dataframe
pip install "rypipe[polars]" # to_polars
pip install "rypipe[all]" # both
import rypipe
import my_adapter
table = rypipe.read(
"data.myfmt",
fields={"amount": "float64", "qty": "int64"},
filter={"field": "status", "op": "==", "value": "active"},
)
print(table.num_rows, table.num_columns)
# Bounded-memory streaming.
table = rypipe.read_stream("huge.myfmt", memory="256MiB")
Pipeline API
Adapters that expose a rypipe.Adapter subclass give you a chainable pipeline
with automatic fusion of rename, drop, cast, and filter stages into the Rust
parse loop. Subclasses only implement read(path, **kwargs)::
from rypipe import RenameFields, DropFields, CastTypes, FilterRows
import my_adapter
source = my_adapter.MySource("data.myfmt")
df = (
source
| RenameFields({"old_name": "new_name"})
| DropFields(["internal_id"])
| CastTypes({"amount": float, "qty": int})
| FilterRows(field="status", op="==", value="active")
).to_dataframe()
The same operations work as kwargs on rypipe.read when you only need a table.
Rust quick start
use rypipe_core::{ExecutionPlan, FieldType, Pipeline};
use my_adapter::{MySplitter, MyDecoder}; // separate adapter crate
let batch = Pipeline::new(MySplitter::new(), MyDecoder::new())
.with_plan(
ExecutionPlan::new()
.type_as("amount", FieldType::Float64)
.type_as("qty", FieldType::Int64)
.filter_eq("status", "active"),
)
.read_path("data.myfmt", false, false)?;
Building
# Rust only
cargo build --workspace --release
# Python extension
maturin develop --release
Testing
# Rust
cargo test --workspace --all-features
cargo clippy --workspace --all-targets --all-features : -D warnings
# Python (against an installed build)
pip install -e ".[dev]"
pytest crates/rypipe-python/tests/
Tests covering optional dependencies (pandas, polars) skip when those
packages are absent. Set RYPIPE_REQUIRE_OPTIONAL_DEPS=1 to turn a missing
optional dependency into a hard failure instead. CI sets it so that optional
coverage cannot silently disappear from a green run.
Benchmark: parallel streaming with frozen schema (parallel Discovery)
crxml (reference adapter) on Ryzen 5800X, 533 MB real / 1 GB synthetic, warm, median-of-7, frozen schema (FrozenSchema crates/rypipe-core/src/schema.rs:21, discovery_ns in get_par_profile()):
| Mode | 533 MB Table | 1 GB Table | RssAnon 533 MB | Schema |
|---|---|---|---|---|
Pipeline::read_path_par par128 (4 MB) |
4470 MB/s | 4278 MB/s | 137 MB | N/A |
ParallelStreamingExecutor 64MB/16t auto (2 MB) |
4497 MB/s | 3782* MB/s | 88 MB | parallel 16×2 MiB sampled Discovery (5.3 ms, was 19 ms serial) |
ParallelStreamingExecutor 64MB/16t explicit schema=[10 cols] |
4980 MB/s | ~4900 MB/s | 88 MB | from_plan exact, no Discovery |
ParallelStreamingExecutor Vec<Batch> auto |
4485 MB/s | 3863* MB/s | 88 MB | same |
* 1 GB auto still 3782/3863 from before parallel Discovery was re-measured on 533 MB only (parallel 19→5.3 ms). Before frozen schema, auto was 4770/4551 (unstable: batch 2 order FieldG vs Text20 last, pq.ParquetWriter raised). Frozen schema fixes order (every batch same, sparse FieldG 30%/Text21 1% as all-null) via ensure_schema crates/rypipe-core/src/engine.rs:79 but adds 5.3 ms (was 15% at 19 ms, now 4% at 5.3 ms), making auto +0.6% vs par128 (4497 vs 4470, within CoV), unblocking auto default. Explicit still +11% and defines the ceiling. Sweep: par peaks at 4 MB, streaming at 2 MB; one divisor cannot serve both, kept split (par 4 MB, streaming 2 MB via budget/(threads×2)). Cap raised 8×threads→16×threads (256) so 533 MB now hits ideal 133 for 4 MB (was capped 128). See crxml docs/performance.md for like-for-like, chunk-per-cell, fixed-chunk isolation (par 1 MB collapses 3553 vs streaming 3812, +7% via chunk_buf reuse).
Run the engine throughput benchmark:
cargo run --release -p rypipe-core --example bench_throughput
Documentation
Full docs and integration guides are in the docs/ directory:
Why Python, not pure Rust
Data work lives in Python : pip, notebooks, and the PyArrow/pandas/Polars
ecosystem. ETL is glue: S3 → parse → rename/drop/cast/filter → validate → write Parquet. That glue is Python; the hot loop that touches every byte at
700 MB/s (2.5 GB/s parallel) must be Rust.
rypipe is Rust where it counts, Python where it ships:
- Zero-copy, GIL-free Rust core parses outside the GIL and hands Arrow
RecordBatches topyarrowvia the C Data Interface : no copy, no serialization. - Python composition :
source | RenameFields | FilterRows | CastTypes | .to_dataframe(): lets the same pipeline be explored in a notebook and scaled unchanged in Airflow/Dagster on 100 GB of files. - Pure-Rust still works when you need it:
rypipe-corehas no Python dependency and is usable as a crate (Pipeline::new(Splitter, Parser)→read_path_par).
A pure-Rust library would save ~0.1 ms of orchestration and cost the 90% of
users who have never run cargo build their workflow. For data teams, a
pip install beats a toolchain install every time.
polarsdidn’t win by being pure Rust : it won with a Rust engine behindpl.DataFrame.rypipedoes the same for ingestion. See the full data-driven justification in Why Python?.
License
MIT
Metadata
Release files for rypipe 2.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| rypipe-2.2.0.tar.gz | 149.1 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| rypipe-2.2.0-cp310-abi3-win_amd64.whl | CPython 3.10 | abi3 | Windows x86-64 | Details |
| rypipe-2.2.0-cp310-abi3-musllinux_1_2_x86_64.whl | CPython 3.10 | abi3 | Linux musl 1.2+ x86-64 | Details |
| rypipe-2.2.0-cp310-abi3-musllinux_1_2_aarch64.whl | CPython 3.10 | abi3 | Linux musl 1.2+ ARM64 | Details |
| rypipe-2.2.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| rypipe-2.2.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| rypipe-2.2.0-cp310-abi3-macosx_11_0_arm64.whl | CPython 3.10 | abi3 | macOS 11.0+ ARM64 | Details |
| rypipe-2.2.0-cp310-abi3-macosx_10_12_x86_64.whl | CPython 3.10 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 1.9 MB
Release files / rypipe-2.2.0.tar.gz
| Download URL | rypipe-2.2.0.tar.gz |
|---|---|
| Size | 149.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
486506ef749fb43cc234f077f227d1a6f36f73dc5c48a1ad8822d3d3ce9c23b0
|
|
BLAKE2b-256 checksum How to use checksums |
aff6e7ba1569231ab15c69a05c2663f08c960dc857433ee5143314c8731b3056
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 4, 2026.
Transparency logRelease files / rypipe-2.2.0-cp310-abi3-win_amd64.whl
| Download URL | rypipe-2.2.0-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 121.4 kB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
85a6a897625556611300ade301b4f7ca9bc044f03cca909918f0bc73722164f7
|
|
BLAKE2b-256 checksum How to use checksums |
5638a2c7c92730e614ab77681aa6acdf5b0307c5c77dec625173310b304f9262
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 4, 2026.
Transparency logRelease files / rypipe-2.2.0-cp310-abi3-musllinux_1_2_x86_64.whl
| Download URL | rypipe-2.2.0-cp310-abi3-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 423.4 kB |
| Tags | CPython 3.10 Linux musl 1.2+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
9cb72344fa8e8199aa072125691a009ca1b558f33c1908f2ba8a5a22a99b6cba
|
|
BLAKE2b-256 checksum How to use checksums |
9a95225f603e1174ef3fcb2e9c2278f1c40119004870738fbeaf6d458ad9501f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 4, 2026.
Transparency logRelease files / rypipe-2.2.0-cp310-abi3-musllinux_1_2_aarch64.whl
| Download URL | rypipe-2.2.0-cp310-abi3-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 384.2 kB |
| Tags | CPython 3.10 Linux musl 1.2+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
bc63253aece45878584af875923c352c1fd244c28682c656c5e6cc51350bbde2
|
|
BLAKE2b-256 checksum How to use checksums |
9fc77e6b6423c9aa326b5b8991dad863c8fe79939575c6b107da5faf7e8aa93d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 4, 2026.
Transparency logRelease files / rypipe-2.2.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | rypipe-2.2.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 211.2 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
7b6ace8efe7598513e337bb6c62602df5d28c3d70148d9eea9b72e4263cc22e4
|
|
BLAKE2b-256 checksum How to use checksums |
6cc9b68cbea8ad1f153f3e68fb683f897cb6e918f5ed88e052a7b0ae7838a3a1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 4, 2026.
Transparency logRelease files / rypipe-2.2.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | rypipe-2.2.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 215.1 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
c6cafeeb9716d530e04b7983e3dbb39d26face221be9a8d22bff8ee69a1042ed
|
|
BLAKE2b-256 checksum How to use checksums |
fe2501fd408c59375443f942fe050b0913a4ef0c234d73dc2699bf90d39cf397
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 4, 2026.
Transparency logRelease files / rypipe-2.2.0-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | rypipe-2.2.0-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 197.8 kB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
1e9c500e3edbfbe6fbad67097c56a6a13994381d7279c5f5e43077699787955e
|
|
BLAKE2b-256 checksum How to use checksums |
fbcc81dd567e21e129ba994a1465b0f4678e27add74dc09899460daa016b81d9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 4, 2026.
Transparency logRelease files / rypipe-2.2.0-cp310-abi3-macosx_10_12_x86_64.whl
| Download URL | rypipe-2.2.0-cp310-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 204.4 kB |
| Tags | CPython 3.10 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
32f0479c9cb764bad8b9a8ff39682258de7a876fdf83724b87dd001b8677d7e4
|
|
BLAKE2b-256 checksum How to use checksums |
515f3ebcc772e51eaeec92c2c2b2a35249f189bbdc62020edf294d634c5476fa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 4, 2026.
Transparency log