Repository navigation
PJA 0.3.0
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_encodeandpja_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. Thepjacommand
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).