Skip to main content

Stream and parallel-process .bz2 files via pbzip2.

Project description

pbz2 v0.2.1

Stream and parallel-process .bz2 files via pbzip2 (parallel bzip2).

Reads compressed files through a pbzip2 -dc subprocess for multi-core decompression — no temp files, no full decompression to disk — and falls back to the stdlib bz2 module when the pbzip2 binary is unavailable. Iterate raw lines, newline-aligned text chunks, or parsed JSONL records, or fan chunks out across a process pool for parallel parsing. Includes a CLI for quick inspection and a Python API for custom pipelines. Corrupt or truncated input raises instead of silently yielding partial data.

Project Structure

pbz2/
├── pbz2/                 # Python library
│   ├── reader.py         # Streaming readers (open_decompress, iter_*)
│   ├── parallel.py       # Process-pool chunk processing
│   └── cli.py            # Typer CLI commands
├── tests/                # Test suite
└── pyproject.toml        # Project configuration

Installation

uv add pbz2

From source:

git clone https://github.com/gitronald/pbz2.git
cd pbz2
uv sync

From a specific branch:

uv add git+https://github.com/gitronald/pbz2.git@dev

Install the pbzip2 binary for parallel decompression (optional — without it, reads fall back to single-threaded stdlib bz2):

sudo apt install pbzip2     # Debian/Ubuntu
brew install pbzip2         # macOS

Note: the parallel speedup only applies to files that were compressed with pbzip2. pbzip2 writes its output as multiple independent bzip2 streams that can be decompressed concurrently; a file compressed with standard bzip2 (or Python's bz2) is a single stream, which pbzip2 can only decompress on one core. Compress with pbzip2 data.json to get parallel decompression later.

CLI Commands

Quick inspection of .bz2 files from the shell:

# Count lines
pbz2 count data.json.bz2

# Print the first N lines
pbz2 head data.json.bz2 -n 5

Python API

Iterate

import pbz2

# Parsed JSON objects from a .json.bz2 file
for obj in pbz2.iter_jsonl("data.json.bz2"):
    ...

# Raw UTF-8 lines
for line in pbz2.iter_lines("data.txt.bz2"):
    ...

# Newline-aligned text chunks (useful for batched processing)
for chunk in pbz2.iter_chunks("data.txt.bz2"):
    ...

Parallel processing

process_parallel streams chunks of newline-terminated records through a worker pool. The worker function receives raw text chunks (so parsing happens in the worker, not the main process), and on_result runs in the main process to handle each result as it completes.

import json
import pbz2

def parse_chunk(chunk: str) -> list[dict]:
    # split on "\n" only -- str.splitlines() also breaks on U+2028/U+2029 etc.,
    # which can appear raw inside records and would shatter them
    return [json.loads(line) for line in chunk.split("\n") if line]

def save(records: list[dict]) -> None:
    ...  # write to db, file, etc.

pbz2.process_parallel(
    "data.json.bz2",
    worker_fn=parse_chunk,
    on_result=save,
    num_processes=8,
)

Reference

Function Description
iter_chunks(path, **opts) Yield UTF-8 text chunks ending on a newline boundary.
iter_lines(path, **opts) Yield non-empty UTF-8 lines (no trailing newline).
iter_jsonl(path, *, loads=None, **opts) Yield parsed JSON objects (uses orjson; pass loads= to override).
process_parallel(path, worker_fn, *, on_result=None, worker_args=(), num_processes=None, max_pending=None, ...) Run worker_fn(chunk, *worker_args) in a process pool, dispatching results to on_result.
open_decompress(path, **opts) Low-level: open a binary stream of decompressed bytes.

Common options

  • num_processors — pbzip2 worker count (default: cpu_count - 1)
  • bufsize_mb — OS pipe buffer between pbzip2 and Python (default: 32 MB)
  • stream_buffer_mb — Python-side read chunk size (default: 4 MB)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pbz2-0.2.1.tar.gz (46.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pbz2-0.2.1-py3-none-any.whl (8.3 kB view details)

Uploaded Python 3

File details

Details for the file pbz2-0.2.1.tar.gz.

File metadata

  • Download URL: pbz2-0.2.1.tar.gz
  • Upload date:
  • Size: 46.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for pbz2-0.2.1.tar.gz
Algorithm Hash digest
SHA256 175dd36636bb74531edbc453e524e5450e28b836cf7ac63dbd9084dd06cfcd77
MD5 d94bfc3dd39d29b7c007955a46cca6ed
BLAKE2b-256 fbd76bc98f44a2ef29b263f3c3e2aaea2689519bf109a96a88f5839a757c7380

See more details on using hashes here.

Provenance

The following attestation bundles were made for pbz2-0.2.1.tar.gz:

Publisher: publish.yml on gitronald/pbz2

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pbz2-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: pbz2-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 8.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for pbz2-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 741044d9ebf01d0e4892b26451bf5567e56d1bffa44653cd1fa59c2e9495d19d
MD5 68b222327af9f26cfd8c2e8317247309
BLAKE2b-256 3d8e4eb68ace5e39c01d5a61764eaa14b9d5d4cb839b4126e1d76a3de97edb6c

See more details on using hashes here.

Provenance

The following attestation bundles were made for pbz2-0.2.1-py3-none-any.whl:

Publisher: publish.yml on gitronald/pbz2

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page