# xstream
[![crates.io](https://img.shields.io/crates/v/xstream-util)](https://crates.io/crates/xstream-util)
[![documentation](https://docs.rs/xstream-util/badge.svg)](https://docs.rs/xstream-util)
[![license](https://img.shields.io/github/license/erikbrinkman/xstream)](LICENSE)
[![tests](https://github.com/erikbrinkman/xstream/actions/workflows/rust.yml/badge.svg)](https://github.com/erikbrinkman/xstream/actions/workflows/rust.yml)
A command line tool to split a stream by a delimiter and pipe each section to a child process.
Each chunk can be piped to a new process, with limited parallelism, or for
embarassingly parallel processing, processes can be reused.
## Installation
```
cargo install xstream-util
```
## Benchmarks
For a simple illustration of the speed up for reasonably sized streams, the following simple benchmark compares generating 1001 streams of integers and summing them with `bc`.
First, generate a null delimited set of streams with
```bash
time for I in {10000..11000}; do seq $I; echo -ne '0\0'; done
```
This stream is roughly 50M, making each stream roughly 50k.
I then piped this into `xstream` as
```bash
and `xargs` as
```bash
| time xargs -0I@ bash -c '<<< "@" head -n-1 | paste -sd+ | bc' > /dev/null
```
which on my system gives:
| `xstream` | 10.21s | 1.67s | 0:09.58 |
| `xargs` | 15.72s | 2.85s | 0:14.52 |
This benchmark is a toy example, but `xstream` already provides a 30% speed up when each stream is only 50k.