Skip to content

PJA 0.3.0

Choose a tag to compare

@github-actions github-actions released this 30 Oct 11:10
· 152 commits to main since this release

The 7-Zip / 7-Zip-zstd plugin is now as fast as the pja command on its own, and a little smaller.

7z a -m0=PJA -m1=LZMA2 photos.7z photos/      # 7-Zip-zstd: -m1=zstd
  • Two streams. The method PJA (03 7F 02) gives 7-Zip two output
    streams: the raw bytes go on to LZMA2 or zstd, and PJA's own data goes
    straight into the archive. 7-Zip binds them that way by itself, with the
    same command line as before. In 0.2.0, LZMA2 read all of PJA's data,
    which it could not shrink, and that was most of the time.
  • Dedup across files. What LZMA2 used to find in PJA's data (one image
    saved several times, progressive or not, with or without restarts, gives
    the same coefficients) the filter now takes out itself: each file's
    stream is coded against the ones before it, as literal runs and matches
    of 32 bytes or more.
  • A thread pool. Files go to the threads as they are found and are
    written as soon as the oldest is done, instead of batches that waited
    for their slowest file; extracting works the same way.
  • 0.2.0's archives still open: its one-stream method is now listed as
    PJA1 (03 7F 01).
  • The C API gains pja_filter2_encode and pja_filter2_decode (the
    two-stream filter), for other archivers.
  • Fixed: memory lost on every call. The models a thread keeps for its
    next file were not freed when the thread ended; the library starts its
    threads on every call, so each one lost about 19 MB, and a 32-bit program
    that called it many times ran out of address space. The pja command
    frees them too now (it lost them only once per thread).

7-Zip 25 on Linux, -mmt=8, one archive per set, every file extracted and compared (to write / to extract):

set 0.3.0 0.2.0 Aqueous pja alone
151 photos 72.57%, 10.9 / 5.6 s 72.60%, 20.9 / 7.8 s 80.46%, 2.3 / 0.7 s 72.61%, 10.8 / 5.3 s
78 JPEGs of every kind 66.86%, 11.7 / 5.1 s 66.90%, 15.3 / 6.2 s 71.91% 70.39%
6 MPO 73.39%, 5.1 / 2.5 s 73.40% 78.94% 73.38%
244 arithmetic-coded 17.25%, 1.9 / 0.9 s 17.37% 85.71% 74.59%
640 generated 16.40%, 3.2 / 1.6 s 16.52%, 4.7 / 2.7 s 33.96% 73.73%

zstd (7-Zip-zstd) now gives the same sizes as LZMA2 within 0.1%. The pja command and the zpaq-std plugin are 0.1.0's: the same streams. Details in doc/LIBRARY.md.

Downloads

platform the pja command the zpaq-std plugin libpja (C library, 7-Zip plugin)
Linux x86-64 pja-0.3.0-linux-x86_64.tar.gz pja-0.3.0-zpaqstd-plugin-linux-x86_64.tar.gz pja-0.3.0-lib-linux-x86_64.tar.gz
Linux x86 (32-bit) pja-0.3.0-linux-x86.tar.gz pja-0.3.0-zpaqstd-plugin-linux-x86.tar.gz pja-0.3.0-lib-linux-x86.tar.gz
Linux arm64 pja-0.3.0-linux-arm64.tar.gz pja-0.3.0-zpaqstd-plugin-linux-arm64.tar.gz pja-0.3.0-lib-linux-arm64.tar.gz
macOS arm64 pja-0.3.0-macos-arm64.tar.gz pja-0.3.0-zpaqstd-plugin-macos-arm64.tar.gz pja-0.3.0-lib-macos-arm64.tar.gz
Windows x64 (7 and later) pja-0.3.0-windows-x64.zip pja-0.3.0-zpaqstd-plugin-windows-x64.zip pja-0.3.0-lib-windows-x64.zip
Windows x86 (XP and later) pja-0.3.0-windows-x86.zip pja-0.3.0-zpaqstd-plugin-windows-x86.zip pja-0.3.0-lib-windows-x86.zip

pja-0.3.0-zpaqstd.tar.gz has the plugin's sources as zpaq-std vendors them, with VENDOR.md. Every binary is built and checked by CI on its own platform (.github/workflows/release.yml), libpja with its C test and, on Linux x86-64, through a real 7-Zip; SHA256SUMS has the checksums. The Linux builds need glibc 2.34 or later; the macOS ones are not signed (xattr -d com.apple.quarantine after unpacking).