Parallel random access to gzip files
Project description
Parallel Random Access Gzip (pragzip)
This module provides a PragzipFile class, which can be used to seek inside gzip files without having to decompress them first.
Alternatively, you can use this simply as a parallelized gzip decoder as a replacement for Python's builtin gzip
module in order to fully utilize all your cores.
The random seeking support is the same as provided by indexed_gzip but further speedups are realized at the cost of higher memory usage thanks to a least-recently-used cache in combination with a parallelized prefetcher.
Table of Contents
- Installation
- Usage
- Performance comparison with gzip module
- Internal Architecture
- Tracing the Decoder
Installation
You can simply install it from PyPI:
python3 -m pip install --upgrade pip # Recommended for newer manylinux wheels
python3 -m pip install pragzip
The latest unreleased development version can be tested out with:
python3 -m pip install --force-reinstall 'git+https://github.com/mxmlnkn/indexed_bzip2.git@master#egginfo=indexed_bzip2&subdirectory=python/indexed_bzip2'
And to build locally, you can use build
and install the wheel:
cd python/pragzip
rm -rf dist
python3 -m build .
python3 -m pip install --force-reinstall --user dist/*.whl
Usage
Python Library
Simple open, seek, read, and close
from pragzip import PragzipFile
file = PragzipFile( "example.gz", parallelization = os.cpu_count() )
# You can now use it like a normal file
file.seek( 123 )
data = file.read( 100 )
file.close()
The first call to seek will ensure that the block offset list is complete and therefore might create them first. Because of this the first call to seek might take a while.
Use with context manager
import os
import pragzip
with pragzip.open( "example.gz", parallelization = os.cpu_count() ) as file:
file.seek( 123 )
data = file.read( 100 )
Storing and loading the block offset map
The creation of the list of gzip blocks can take a while because it has to decode the gzip file completely. To avoid this setup when opening a gzip file, the block offset list can be exported and imported.
Open a pure Python file-like object for indexed reading
import io
import os
import pragzip as pragzip
with open( "example.gz", 'rb' ) as file:
in_memory_file = io.BytesIO( file.read() )
with pragzip.open( in_memory_file, parallelization = os.cpu_count() ) as file:
file.seek( 123 )
data = file.read( 100 )
Via Ratarmount
Because pragzip
can be used as a backend in ratarmount, you can use ratarmount to mount single gzip files easily.
Furthermore, since ratarmount 0.11.0, parallelization is the default and does not have to be specified explicitly with -P
.
base64 /dev/urandom | head -c $(( 4 * 1024 * 1024 * 1024 )) | gzip > sample.gz
# Serial decoding: 23 s
time gzip -c -d sample.gz | wc -c
python3 -m pip install --user ratarmount
ratarmount sample.gz mounted
# Parallel decoding: 3.5 s
time cat mounted/sample | wc -c
# Random seeking to the middle of the file and reading 1 MiB: 0.287 s
time dd if=mounted/sample bs=$(( 1024 * 1024 )) \
iflag=skip_bytes,count_bytes skip=$(( 2 * 1024 * 1024 * 1024 )) count=$(( 1024 * 1024 )) | wc -c
Command Line Tool
A rudimentary command line tool exists but is not yet shipped with the Python module and instead has to be built from source.
git clone https://github.com/mxmlnkn/indexed_bzip2.git
cd pragzip
mkdir build
cd build
cmake ..
cmake --build . -- pragzip
The finished pragzip
binary is created in the tools
subfolder.
To install it, it can be copied, e.g., to /usr/local/bin
or anywhere else as long as it is available in your PATH
variable.
The command line options are similar to those of the existing gzip
tool.
src/tools/pragzip --help
# Parallel decoding: 1.7 s
time src/tools/pragzip -d -c -P 0 sample.gz | wc -c
# Serial decoding: 22 s
time gzip -d -c sample.gz | wc -c
C++ library
Because it is written in C++, it can of course also be used as a C++ library.
In order to make heavy use of templates and to simplify compiling with Python setuptools
, it is mostly header-only so that integration it into another project should be easy.
The license is also permissive enough for most use cases.
I currently did not yet test integrating it into other projects other than simply manually copying the source in src/core
, src/pragzip
, and if integrated zlib is desired also src/external/zlib
.
If you have suggestions and wishes like support with CMake or Conan, please open an issue.
Performance comparison with gzip module when a gzip index exists
These are simple timing tests for reading all the contents of a gzip file sequentially.
import gzip
import time
with gzip.open( gzipFilePath ) as file:
t0 = time.time()
while file.read( 4*1024*1024 ):
pass
t1 = time.time()
print( f"Decoded file in {t1-t0}s" )
The usage of pragzip is slightly different:
import indexed_gzip
import pragzip
import time
with indexed_gzip.IndexedGzipFile(gzipFilePath) as file:
file.build_full_index()
file.export_index(gzipFilePath + ".index")
# parallelization = 0 means that it is automatically using all available cores.
for parallelization in [0, 1, 2, 6, 12, 24, 32]:
with pragzip.PragzipFile(gzipFilePath, parallelization = parallelization) as file:
file.set_block_offsets(open(gzipFilePath + ".index", 'rb'))
t0 = time.time()
while file.read( 4*1024*1024 ):
pass
t1 = time.time()
print( f"Decoded file in {t1-t0}s" )
Results for an AMD Ryzen 3900X 12-core (24 virtual cores) processor and with gzipFilePath=4GB-base64.gz
, which is a 4 GiB gzip compressed file with base64 random data.
Module | Runtime / s |
---|---|
gzip | 17.2 |
pragzip with parallelization = 0 | 1.25 |
pragzip with parallelization = 1 | 13.8 |
pragzip with parallelization = 2 | 7.0 |
pragzip with parallelization = 6 | 2.5 |
pragzip with parallelization = 12 | 1.47 |
pragzip with parallelization = 24 | 1.25 |
pragzip with parallelization = 32 | 1.33 |
The speedup of pragzip
over the gzip
module with parallelization = 0
is 17.2/1.25 = 14.
When using only one core, pragzip
is faster by (17.2-13.8)/17.2 = 20%.
Internal Architecture
The main part of the internal architecture used for parallelizing is the same as used for indexed_bzip2.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Hashes for pragzip-0.2.0-pp39-pypy39_pp73-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 365d621b3ed415795402bec720018344eee5a14523ad05e7ad6ea69c82172be0 |
|
MD5 | e26cce424cc56c88f9e008ec3e4d251d |
|
BLAKE2b-256 | d965a1a40862062a4bb27c828fd8c8bf05bd08a9a36242889890382905791d71 |
Hashes for pragzip-0.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 96687e730288e6369a2d6af258ca2c2a7ddbdf7834be9ef2252d14fdd1ba6e63 |
|
MD5 | 9ed2e8020355fa9fde3658a6ef10acd0 |
|
BLAKE2b-256 | f7d05f53a2eb0a78dd1c432e7037d5021eeeb076a177b1e3d03b6fbeead1879f |
Hashes for pragzip-0.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 44ab36bc13ba2a12842617a174678bb9052b39474c6f32014cc54271230b89c3 |
|
MD5 | 802393200eb7ef0641c2fa51d24afee1 |
|
BLAKE2b-256 | de60e0a34f8ca1313958db66f4651c7d933467180d7af8fa707b9aafd6737ea5 |
Hashes for pragzip-0.2.0-pp38-pypy38_pp73-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ebf9077e7a23e06b056f13769ded794e584ea3a8f6e1845b26010d5901710fd0 |
|
MD5 | 0a45c9ed02c1b1971ed1bcdf5d3cb6a2 |
|
BLAKE2b-256 | b4a7bc88423582a25d83448f02fb6532518ed2a4056c15673bb48dcb8609bdde |
Hashes for pragzip-0.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 876b8dc5703ebcaaf8298ba3110f3891fc5135ec47fd21c22cd5d558ea6d2fce |
|
MD5 | cc017c4b84b14b6ed90455ae384a55ca |
|
BLAKE2b-256 | 5121c1a43d7cd60870eaac2079337d3314ba8d23f54a2396e506cee07ecc61ee |
Hashes for pragzip-0.2.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c79938c33f6d79faf96beeb23bd55f386f4ec3a79f64c7e4b6ca539adf58218c |
|
MD5 | 46ba8ffc1122947bf7a548d53e730da0 |
|
BLAKE2b-256 | 12dd5c4488416652bb97ec465eee92d2878f8c1401eef7b6a3593f69c1ba71e8 |
Hashes for pragzip-0.2.0-pp37-pypy37_pp73-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 88c0232602c98ce176098c918f0c781d9e4c2acbb71e8f52db799834cc8afbc6 |
|
MD5 | 33ed7c7ec22e9901ddff607f302045fb |
|
BLAKE2b-256 | 4b037bc3bd14b54cc960b4d7c161fe4135c54f529f96943243ecfccf22f14327 |
Hashes for pragzip-0.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7dd1ffee43f0e73ba82e40a281bb30fc640061e62ae968e0cbfacf44b0ddced5 |
|
MD5 | 6c2bc31fe528d562665c0a28af70541d |
|
BLAKE2b-256 | 0ad02aa2c137a8fb0b37738a1f04e35e019ff838a1ce04f74af274abd57fa8a2 |
Hashes for pragzip-0.2.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7d44cdddbfb5936b3738407cd8cf990eb9a7d9766ba7bc506c8ce20819f8b78c |
|
MD5 | 94fa37a8327d90db91121b9a22bd4593 |
|
BLAKE2b-256 | af2e6ed02a3df76a29fbb3ee8b3716de79cd58f53449c86773121b8a54b14faa |
Hashes for pragzip-0.2.0-cp310-cp310-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 566526c9b213dd0c15818bae26870a09744b57261babc813b5365e678424c4e5 |
|
MD5 | 6ac36fefe9d97ded3fc1638515f16a8c |
|
BLAKE2b-256 | 504f9fc7d81805c185eeddc4a763ef71be97686dc1a735ea1ada97cc336de4aa |
Hashes for pragzip-0.2.0-cp310-cp310-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c8373d8048ddc16185eed823c6f21f909c97d7e81f3a1deb33a3abc72e7923c0 |
|
MD5 | 321ecdc108d39059ea04cb8953808604 |
|
BLAKE2b-256 | 93ce22b61252aa2c20a71db9e8017290726629f269ef890126cccebf0445ab82 |
Hashes for pragzip-0.2.0-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 04cd7480c77f83ee01eea75d59940bfe2c9361016cea469125e7778f5d5ecc07 |
|
MD5 | b95124e0c218d38b452d92006bda410b |
|
BLAKE2b-256 | 20a5e16a202fb5278d1dcd1165e46e606c9f50173a0196f7a7542ca20743cdfc |
Hashes for pragzip-0.2.0-cp310-cp310-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9de981fd048fbf5b192d9d2e4759070e3017e5843887c678e9d4091d698474f7 |
|
MD5 | e1f21ddf671be92eeb7ce0b5449c59b6 |
|
BLAKE2b-256 | 4c06901b19d485efdf522c175e5d297705f23951335de7dcab360fab9123abc0 |
Hashes for pragzip-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | fd6b2226c18066e2d6cb4a9c4eacc0a638c91593bbdd77a3ee728e14cb33d4fc |
|
MD5 | 8fa42f20407c285b4f356f122e22e119 |
|
BLAKE2b-256 | 5b5f71f2a4dc8d0b0f33a4422ff326660ba040c315256e62fb38e8a71ddc40f0 |
Hashes for pragzip-0.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 919f385d63c0be5e6012c8fa79bac00c777936810fa6216c877aed88e2c078a5 |
|
MD5 | c937c5134020310d3d5053d4bd7772bd |
|
BLAKE2b-256 | c661f3a78e28e3958fc05fd2e6d2e8ca2374b72b52b9a264c5364f3d039aa08e |
Hashes for pragzip-0.2.0-cp39-cp39-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | dc12f806ad36e0209898bde6ff78feddb737e4dfd64ed911c09ea42633c89cea |
|
MD5 | 1f73ef58f775efe9955ac44723c34258 |
|
BLAKE2b-256 | b1d2c3eff970266c5e68d4c5c26f9b7fa08ae7fc389b5c03eb59e46052c7e39e |
Hashes for pragzip-0.2.0-cp39-cp39-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a7f12f92b0cddc271911fd72697533b81309a5b4042f368ef259683a1a48ea17 |
|
MD5 | b50fbebabbb3e6d98981d814920c84d0 |
|
BLAKE2b-256 | 95ba6ea807318c1628a3e35845756568307d722793fdf338e00ce4612da8cde7 |
Hashes for pragzip-0.2.0-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 73bbe038bbe8904e449c78467a489ef6d75297efbdc08aca27f68bdc7d341dd0 |
|
MD5 | 36e7468ff1ac6e0ebbd23c2f84b83e0a |
|
BLAKE2b-256 | ea5d724a2be03dae158352c00471a98d2f627e189a512080cb8c5a8bbac6eebe |
Hashes for pragzip-0.2.0-cp39-cp39-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 60d8a3c40b2853d568149f90a945576ead7a653bde139bf99c9fa7f0ae8c0e35 |
|
MD5 | aef50122fc8ab824142adefc86131cda |
|
BLAKE2b-256 | 80f0cd0364195a6d2e90dfad907b39be586bd28b510fd79b87862a5ac1b31f7d |
Hashes for pragzip-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 265e1449fd7282f0a40efd71c148d968dea14f48e138d4605dfaa00271e81bde |
|
MD5 | 11a1f73fa9d731e0de7b0a9334a70d56 |
|
BLAKE2b-256 | 3d00dd5eb53636e51681d5b092d6054bee3282203fbcb99dd3bd58bbb20924b1 |
Hashes for pragzip-0.2.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2d71d7932b602fd496c7e80bf5a21dc8c96672bcac02c7eadbf975f3b30ef298 |
|
MD5 | c193d9e4be0e6aa57a44cddad04bb27a |
|
BLAKE2b-256 | be7a2ee45e67524798e65ef8ff969a499eb18a7782c511bd343f091420584f78 |
Hashes for pragzip-0.2.0-cp38-cp38-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a0e28075f8e3e6e5828b2e95416305b90cb3efab40ee0268fbeb4ce6ab7cd922 |
|
MD5 | 1248e03bf512c6da4bf072f0b4e48b55 |
|
BLAKE2b-256 | df34df34f51226542d20cdfeeb0900c0c9909f4b08f2e4bf404349a66e924533 |
Hashes for pragzip-0.2.0-cp38-cp38-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6bce584632ba992f4b0c0a441f7a5c757fb8ca8479f6397d0f62616737af942d |
|
MD5 | 43fc2008d7398e02bbab36284a5e9f85 |
|
BLAKE2b-256 | e9cc847f0b75c5231905a8b7c9a0534d6eac746a6439e6d951b690f5adf5617f |
Hashes for pragzip-0.2.0-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2aed8fffc5094b6f452f3e05eff9c74afbc1ac089eb3057b387d7a63522fbb35 |
|
MD5 | e49d8fd3845d537279e3d5fb7905cd61 |
|
BLAKE2b-256 | bb7b5d3894417dea4a7c8161ffd8c3b62f41b1fd5ea5d81bc9c7157c686cdc49 |
Hashes for pragzip-0.2.0-cp38-cp38-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 56d20d8219fd4203dc69ef08407aa8795794f5efd66eca74a596328dc42fe061 |
|
MD5 | 85ddadd28a7936ba3ac8645432a76ce1 |
|
BLAKE2b-256 | aeb672859ee9df524fa45a494d34ce98566407758f96694f9ff18dc26dd73ee2 |
Hashes for pragzip-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0a9a3f0de63c3ebf89f424626744e4f71f3c7804acdfdaf1cef5f1c350a2baf0 |
|
MD5 | 81ec07dd62f0d20b4083ab12afcbe369 |
|
BLAKE2b-256 | f051284e01ddafb23035ed15b5c40eb0b651a6689972dbfbdf6f092b93627e36 |
Hashes for pragzip-0.2.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 68c2cd8eb569ec4ddb99ceab60ec608154b30ba7ba5c1c3e12ad7eb3ca382160 |
|
MD5 | 12aa640db56768c6e4322a77d44ff051 |
|
BLAKE2b-256 | c4e4421f2d475a1638aa0912f3df5b755efd4667405609e2c60a927e122fc96b |
Hashes for pragzip-0.2.0-cp37-cp37m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 25cd3f499c2cfcd956458e02930dee208bc297168fb10e644da38143be25fbdd |
|
MD5 | 929a5c69986b62deebfc5b31de9a2063 |
|
BLAKE2b-256 | a1480a3d95b47ce51c2430a415984810db5a7441286f7da4c8576515093a21e1 |
Hashes for pragzip-0.2.0-cp37-cp37m-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 99a811f40a81c2bed7a3e4276617842e715c0784bdc3656bae4db3b9f3e25a22 |
|
MD5 | cfec6aadb243bda14161b811a9751c89 |
|
BLAKE2b-256 | 46128ac55795232a188477dd55f9507171d979f18acb666a8a3f79c00f12be70 |
Hashes for pragzip-0.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0b2b174b14493e3304898f317f516c1a9a453453a5c8e41a045b562ea27904bf |
|
MD5 | 2cce62b365f49baed752e46ee4688902 |
|
BLAKE2b-256 | 7775b3228e644043710bde19086936d92a890a90061b22e6777f64dff9607d2c |
Hashes for pragzip-0.2.0-cp37-cp37m-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | bb219c0b64fd6819e458d1fe830316512f474fb520ee2c641063334a9d254acf |
|
MD5 | 3aee45b74dc180ad196f0e4d0a189fef |
|
BLAKE2b-256 | 702e8f9f1bcc5e511666b3b573978d65dfcfa90bc15debfa74f3144a16b6b002 |
Hashes for pragzip-0.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a9a19ba435d2b581da00cedf8d7da7b27278edba7711c876641fca67f93a72c1 |
|
MD5 | 883fb3010f6f282783581c1017381c16 |
|
BLAKE2b-256 | 94b4771cf5214f2a7148a760415113dab9fea617f41f9344c2aec6799ca2d8d7 |
Hashes for pragzip-0.2.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 743f760d6cb122679ce463291138252824301b67e8e5298c438af7169fa99316 |
|
MD5 | 1072d9314dcd76247b652d5b61d259f2 |
|
BLAKE2b-256 | fa1b8627b27306c7787b2cf6fcbea6c41ad9dc679262b7d4b1d4319a4e541211 |
Hashes for pragzip-0.2.0-cp36-cp36m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | dbddb023503d342d43fe7f35e8d71e3e01d97a6f187c4c18c5aaac87b2e4d9e9 |
|
MD5 | d58ba1173da7f1efb47aa4de3694c7dc |
|
BLAKE2b-256 | 1da05296a047924f9f21882ab5c386678d6b4215161f3e5b9412e82b1ab4384e |
Hashes for pragzip-0.2.0-cp36-cp36m-win32.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 04c3360f1865bd17523aa0ad8c3f091914f785b22dd8e382cca631853af0eb4d |
|
MD5 | 1e7a64d3fbedcd9f72723759c99e307c |
|
BLAKE2b-256 | d87b26e18589783008470a195da7a5d365405e44129003fe181ba3ebaa68fbe6 |
Hashes for pragzip-0.2.0-cp36-cp36m-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 25bd77fe97916aae73cc41fdeeb2eb5016aee728752fede8ba51e00a7c756cea |
|
MD5 | b07309d258ff9be67e57e8e421f95c2a |
|
BLAKE2b-256 | 1cfc794e38dde8c01a601b97f9b0e9cf60587a6481ed13131f612d188bf7fcb7 |
Hashes for pragzip-0.2.0-cp36-cp36m-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c89c7aa0d57dddf4eeb86794feb0d6498bb7a5249ea6d459c9c0421218da990c |
|
MD5 | 4f174e4dcfe7f06619b518ee58bbc56d |
|
BLAKE2b-256 | b56648a9064a3f271cbbb8f6a25cce5022c9360212ace2251db9a928742889c9 |
Hashes for pragzip-0.2.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ddf84ff9c89c6d97c11072252fcba425ba1239d96bae8950eef9c32840a82392 |
|
MD5 | 2d4d4f325414f6c74e13fd494c22a798 |
|
BLAKE2b-256 | a4e8b31a2126e9e351fafd9b5f52419f3ccdf6ca264a84bd4efeae8be22bc7b9 |
Hashes for pragzip-0.2.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4608597ba4738f8fb6ff96e583b118c6b55a7873315a011cc1b4519c6038454c |
|
MD5 | 797deef39b193bff4142fb93f7b196f8 |
|
BLAKE2b-256 | 9e3cccb01e75e30000cc79bc0a428c1812ba99d15907376b773c2a20353a5647 |