Parallel random access to gzip files
Project description
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
Performance
These are simple timing tests for reading all the contents of a gzip file sequentially.
Results are shown for an AMD Ryzen 3900X 12-core (24 virtual cores) processor and with gzipFilePath="4GiB-base64.gz"
, which is a 4 GiB gzip compressed file with base64 random data.
Be aware that the chunk size requested from the Python code does influence the performance heavily. This benchmarks use a chunk size of 512 KiB.
Decompression with Existing Index
Module | Runtime / s | Bandwidth / (MB/s) | Speedup |
---|---|---|---|
gzip | 17.9 | 180 | 1 |
pragzip with parallelization = 0 | 1.21 | 2700 | 14.8 |
pragzip with parallelization = 1 | 14.0 | 230 | 1.3 |
pragzip with parallelization = 2 | 7.2 | 450 | 2.5 |
pragzip with parallelization = 6 | 2.51 | 1300 | 7.1 |
pragzip with parallelization = 12 | 1.40 | 2330 | 12.8 |
pragzip with parallelization = 24 | 1.11 | 2940 | 16.1 |
pragzip with parallelization = 32 | 1.12 | 2920 | 16.0 |
Benchmark Code
import gzip
import time
with gzip.open(gzipFilePath) as file:
t0 = time.time()
while file.read(4*1024*1024):
pass
gzipDuration = time.time() - t0
print(f"Decoded file in {gzipDuration:.2f}s, bandwidth: {fileSize / gzipDuration / 1e6:.0f} MB/s")
The usage of pragzip is slightly different:
import os
import time
import indexed_gzip
import pragzip
fileSize = os.stat(gzipFilePath).st_size
if not os.path.exists(gzipFilePath + ".index"):
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.import_index(open(gzipFilePath + ".index", 'rb'))
t0 = time.time()
# Unfortunately, the chunk size is very performance critical! It might depend on the cache size.
while file.read(512*1024):
pass
pragzipDuration = time.time() - t0
print(f"Decoded file in {pragzipDuration:.2f}s"
f", bandwidth: {fileSize / pragzipDuration / 1e6:.0f} MB/s"
f", speedup: {gzipDuration/pragzipDuration:.1f}")
Decompression from Scratch
Python
Module | Runtime / s | Bandwidth / (MB/s) | Speedup |
---|---|---|---|
gzip | 17.5 | 190 | 1 |
pragzip with parallelization = 0 | 1.22 | 2670 | 14.3 |
pragzip with parallelization = 1 | 18.2 | 180 | 1.0 |
pragzip with parallelization = 2 | 9.3 | 350 | 1.9 |
pragzip with parallelization = 6 | 3.28 | 1000 | 5.3 |
pragzip with parallelization = 12 | 1.82 | 1800 | 9.6 |
pragzip with parallelization = 24 | 1.25 | 2620 | 14.0 |
pragzip with parallelization = 32 | 1.30 | 2520 | 13.5 |
Note that pragzip is generally faster than given an index because it can delegate the decompression to zlib while it has to use its own gzip decompression engine when no index exists yet.
Note that values deviate roughly by 10% and therefore are rounded.
Benchmark Code
import gzip
import os
import time
import pragzip
fileSize = os.stat(gzipFilePath).st_size
with gzip.open(gzipFilePath) as file:
t0 = time.time()
while file.read(4*1024*1024):
pass
gzipDuration = time.time() - t0
print(f"Decoded file in {gzipDuration:.2f}s, bandwidth: {fileSize / gzipDuration / 1e6:.0f} MB/s")
# 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:
t0 = time.time()
# Unfortunately, the chunk size is very performance critical! It might depend on the cache size.
while file.read(512*1024):
pass
pragzipDuration = time.time() - t0
print(f"Decoded file in {pragzipDuration:.2f}s"
f", bandwidth: {fileSize / pragzipDuration / 1e6:.0f} MB/s"
f", speedup: {gzipDuration/pragzipDuration:.1f}")
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=pragzip&subdirectory=python/pragzip'
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
Command Line Tool
pragzip --help
# Parallel decoding: 1.7 s
time pragzip -d -c -P 0 sample.gz | wc -c
# Serial decoding: 22 s
time gzip -d -c sample.gz | wc -c
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
pragzip
is planned to be used as a backend inside ratarmount with version 0.12.
Then, you can use ratarmount to mount single gzip files easily.
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
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.
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.5.0-pp39-pypy39_pp73-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e8732ccf15c51592c0bc48db79e1099a739ba9acd68f1e7024ea5e3d3820ebff |
|
MD5 | 26975550f60b5c19bb0596606817d268 |
|
BLAKE2b-256 | b391c93d0f28b4e4041d3c9b0a7b6bcf6c56710da9d998b053eb6faf4e830587 |
Hashes for pragzip-0.5.0-pp39-pypy39_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | aa6860d2992b6f47d43e412e840cfc56703fcf66db5afc2d822d95494300c9ff |
|
MD5 | 616cd1454653395e6549f2c3cb75c998 |
|
BLAKE2b-256 | ae9a1cb610fd2ed3e39b70569eb98b8715a7180940f61ab9c0064b59c1690c35 |
Hashes for pragzip-0.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8f4448a18d3dac9cea08a47d1831c0915018edb2c65d6b7717219de783ce9994 |
|
MD5 | 9d3e3a3781d9c0adfe7c6e6a734d7fed |
|
BLAKE2b-256 | 538c2186733f159addb07f02b7185758f8d59d12427ec6e08f4e7867422aeef4 |
Hashes for pragzip-0.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ef203ad48c25b442f7ee57f63abc74a6f12ad28052037fae3c14923279f246f3 |
|
MD5 | 64cf9dd18b3478c15bc2c7cd5ff2b3da |
|
BLAKE2b-256 | f051ed6458f22b40c8aa097f659f7a41194adffdd566772df6678803cea3b7aa |
Hashes for pragzip-0.5.0-pp39-pypy39_pp73-macosx_10_14_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a87622ac38456502760c7bfe9f3d92ba3ca7e9f952b562eaf1c5cee0663306f7 |
|
MD5 | e2e10dd4a9db6718fb256752b2153945 |
|
BLAKE2b-256 | 2aa9798f3570f25c9b882b3bef83a87e73a9307ad60e283bd64e33f444153ed7 |
Hashes for pragzip-0.5.0-pp38-pypy38_pp73-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3cd67a742df889d042a87a3f631bc0c307fee028ab33657bc2f59c2d02c2feaf |
|
MD5 | d79f8806482dd370768b70a0039222da |
|
BLAKE2b-256 | 46b64e4445eff71336a55150a2f0a7b27f9bacc6deb68551f778bd604282ce10 |
Hashes for pragzip-0.5.0-pp38-pypy38_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 029eaafaeb2b9ea902abd04fb8f36483dc27ce62ace2108ad9694e84454d24a0 |
|
MD5 | 4f03d69c3449c449a96dc5496ebd391e |
|
BLAKE2b-256 | ab1438ad6692fede7c7b386255985a6fb6ac90d455f56f54dad374882afe58be |
Hashes for pragzip-0.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | fdd977fdd1e1e773884201f12da9738d08dd1eb589fb417426058c39a3cf14d7 |
|
MD5 | 2b0d8bccc1451137cd2ffa21b461f9ab |
|
BLAKE2b-256 | 4b007bb252402bdf76e225b41bba0d6fcfe54628cc9e2d5ebaef16996ff78ac6 |
Hashes for pragzip-0.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e850e56959800265838bfa28671c6e45fafcd8ae691318a751b8ed552dc24985 |
|
MD5 | 6973f6697233d0d8165c0c1059c01cda |
|
BLAKE2b-256 | f920f11d7b4667bd73762e91bb738ffae748bc5fdfd9b4f18ece050293fcea03 |
Hashes for pragzip-0.5.0-pp38-pypy38_pp73-macosx_10_14_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a153e7cf7ada5a31315627bc69d50d7c1f0105fbce5d147db3eaa0c82c702cab |
|
MD5 | 119c1a829e6d8f53a015857b98e68b3e |
|
BLAKE2b-256 | f1bf0acc264ba72d171a0a6ec62da50d2b66c0df83dc421008005400872e3703 |
Hashes for pragzip-0.5.0-pp37-pypy37_pp73-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8fa9adbedbacfeb29d18a0baed8371107e80725c16edf3eeb99b4d6275e00b4c |
|
MD5 | eca330e337c5692dcf4da8c3ab3273c4 |
|
BLAKE2b-256 | 15a2c6355b92437bb75005149fd9842e92ce8fd4443e0d293806104e59775707 |
Hashes for pragzip-0.5.0-pp37-pypy37_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f0a1224fa66d01eb635db888b9c471771c7112f0b69f2d3b0231407b7954a070 |
|
MD5 | 6847f44e1b22f7d8f6271b6b72a51507 |
|
BLAKE2b-256 | 890f6a701f4b65875147ffc8fb3f7b3dcec4c8e9ec128ba95dd342c2f012068d |
Hashes for pragzip-0.5.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | fdca20afb0e78d589433ddf6c41f891182e5220c4eec32c08f567717e2fc5ba5 |
|
MD5 | 0b7358ed05a80f35d492702ee980b767 |
|
BLAKE2b-256 | c36bb2cabac8a3a9bce9352966451e29f55a90f49bd72ab96616b5f0d69978f1 |
Hashes for pragzip-0.5.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f8dfb5c162bcc67ff6e57ad337a03ae6bebe81cdfde5f401c023d02dd8ca170d |
|
MD5 | 30a9b45277aab3804ed62d3db4ec1ae1 |
|
BLAKE2b-256 | ee86603a18819a5f625b442111b745a611abc18576103c971c00952d82b39992 |
Hashes for pragzip-0.5.0-pp37-pypy37_pp73-macosx_10_14_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b15b2ff8b39c7f35fd8bed16131736ecd8aab2b908a339341573faa8f990bc75 |
|
MD5 | acd0c8bb5c40f43b1e0a18bcd832ad04 |
|
BLAKE2b-256 | 6dc79df5343a38081c307dc9b43e9d777bf25b6783d5630ced52fec8e5d2fb7d |
Hashes for pragzip-0.5.0-cp311-cp311-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 122278ffc5b09a3f32cb21d681fd89e42ca91c81c41d3757f6e45b204eec0c75 |
|
MD5 | cdb09b530440196814baed2cf8799bdf |
|
BLAKE2b-256 | 3c00462bf2c64c165550c0fa0c1e45b8f64597bb2127fe97cb7ccab9606bce1e |
Hashes for pragzip-0.5.0-cp311-cp311-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 128f431251d88c1a4e032565e0935628e8fa1476c7b65427c44a2d0d6906b1c7 |
|
MD5 | 146919da32eb8153d35b30512b83a540 |
|
BLAKE2b-256 | 16dd8d168915f773a0152211e6fee3933c5f112bce822bb36ba8dddaf947655a |
Hashes for pragzip-0.5.0-cp311-cp311-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8f97a3af27f43f566eb994d0b18037edcd48e0aa4a450e3edb532131a20b8cff |
|
MD5 | 53d7f1365c503d87f251ef989ed25d33 |
|
BLAKE2b-256 | 31a3c0112751b78c7704ca6896d9bc8e233a7a4f81ec4d3ab29a5b0bc8fe0ce2 |
Hashes for pragzip-0.5.0-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 75a0e59d5c0e4eedf05f910aa0893881230e0466e142fee513d9f95b8a5b9061 |
|
MD5 | f988a4a0516dba2550da72eb3c32fc3a |
|
BLAKE2b-256 | 91d3a4a9f32d076f2f54f7aec0ebba2d262cc199936aefaed14895701c9d71ae |
Hashes for pragzip-0.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f456b1e1fbd272f51e94a5fc7ad507ba66505c44c392afac1f587b35584f36bf |
|
MD5 | 9050db42abddd6714bb6c671731f7c4b |
|
BLAKE2b-256 | e749921e5aad74cb8edcc8f75805ef57b5400b82011aad17c4b067de219cd15d |
Hashes for pragzip-0.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | bd63d21df26905fc16e5d18fa7e8be3fb683663e633dfe7e71d38b1f656c3c65 |
|
MD5 | cb43b3490a3091a640f820ed09f4480d |
|
BLAKE2b-256 | 8fd86bc822714dc94707b4c9e221b6961e9e32e8338e48c7ac47c0f672c8e32a |
Hashes for pragzip-0.5.0-cp311-cp311-macosx_10_14_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2b218b030fa453dab5fd0c1ec5b728b25e029c18f4d8cbe72a7c06544a98b291 |
|
MD5 | d2f718dd6c2a975e2372ac0a6d28d490 |
|
BLAKE2b-256 | 8649baee3e4cc88b101a10e3e48372773371f36f64d44eb8d51b0ac29cb2a6b0 |
Hashes for pragzip-0.5.0-cp310-cp310-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 785465080d418105a1fdadfa4ea5484bba563cba8bae625ad36c3646099525db |
|
MD5 | 53f09f312c3a56a49bd5597d67487445 |
|
BLAKE2b-256 | 818adc0f4760ac8b54446a7d11d9853edf840f731752ba400f204cbea6cfc2a8 |
Hashes for pragzip-0.5.0-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 200ec1750f14356d712f5ef851283623ff656e334a8d6d640e88be66808a1723 |
|
MD5 | cdcdecaf4569e0b6b18c1211e2fe02b6 |
|
BLAKE2b-256 | 0f54fd785680a9d267be474a2b3189e5020fe1de8aeb598aeede510ce3f716c1 |
Hashes for pragzip-0.5.0-cp310-cp310-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f3d2e9303565cc33c0b1149030c60338dd6473568cb1c84ec68bb5b5e8dccbe1 |
|
MD5 | 5ede38c719566f1f730d3372246314ae |
|
BLAKE2b-256 | d618fd182c9bc8288f7318a4d16e151b8715ccba817c94d7000cee0921be19e2 |
Hashes for pragzip-0.5.0-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5fafc350046dee6843a15528a131358ad58206e7547c134eaa6a222cd79b5291 |
|
MD5 | 35abd8b30b2862007df351c985a2fca0 |
|
BLAKE2b-256 | 81affd649fc18c688c832ded369d2555590df8fb7e2d125309b817a084f89a74 |
Hashes for pragzip-0.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8824ae8b42559acc98db34e1ba20cbb1bbfe364b27ff18a6142986ef62387fd5 |
|
MD5 | 8fd3e30c247253f9491539e03d31747c |
|
BLAKE2b-256 | 7eb6b942f5850006080538976b6563d1cfffe7083036f658e694d346dbf4db0a |
Hashes for pragzip-0.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 33397441990b7ccdac096606e135ff200faabe35016ffdf7f6f572a0e36e4d6a |
|
MD5 | 8a97e4f20c6702f70b8a0ef0a9d1ac85 |
|
BLAKE2b-256 | 6149bef5957c2619594025191d116b956f50b7233cd45abf0289a69a3e9c395f |
Hashes for pragzip-0.5.0-cp310-cp310-macosx_10_14_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 35a9b1c2941dc0a8fc7376d1e86fd8be7823cc4e57a0a259d949a5933acf5e0d |
|
MD5 | dd4f0cf3a30d622eaedfe774a80c0be9 |
|
BLAKE2b-256 | 7ebc9f9a3332ca367fd7fe074df242157553e088e3b22d6912e13919a8c23e99 |
Hashes for pragzip-0.5.0-cp39-cp39-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | bc38a98b7d47c896c86351a69949d81975be9134ed5a839399c7d1098617505a |
|
MD5 | dfdffd53674bda1374792aca3fe4ce41 |
|
BLAKE2b-256 | ce357b8134a7cf1d952187588647c674e2f54144dbd38535a7f99c366949727f |
Hashes for pragzip-0.5.0-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 580d980f1c21651af63d72ca9631bebabd6de8a062376063622ec7e944b7984b |
|
MD5 | 64fe344eca27158b29371f8514164fbb |
|
BLAKE2b-256 | fda3a87a9c5ceec93e8d43d33d221cebcdb54c147aea10c24f1750a46bdac4d5 |
Hashes for pragzip-0.5.0-cp39-cp39-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7eee0a1bb365f2e6b0927faf36b6498700fbf2cb431abb218d5636504b028c26 |
|
MD5 | 76c2e2e561069aa0c06da364115bc85f |
|
BLAKE2b-256 | 501435ba6f7a23d815321c9bf1a1e02290a25f9ac2309e3eaff5a38d1f68e68b |
Hashes for pragzip-0.5.0-cp39-cp39-manylinux_2_28_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2505c6dd8d788cf057c762e48500de19312c60aca39c0d0d968202590582a36f |
|
MD5 | 217df38b4e7d63f41c69221ef370c8f9 |
|
BLAKE2b-256 | c959748af367650a595b77c30b47d4b615a38eaa8081e2f29d05b364033b1200 |
Hashes for pragzip-0.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 07a4bfc36d6d3740aa4a012c865c1981d79269ab3d950a4d2dcfdebbf0a1b149 |
|
MD5 | 7c0959752ae2b8f3e8c42155aadfe80f |
|
BLAKE2b-256 | 97160657f2e36fa9147137b84dd2ddf5d484cac36fcf51c412388a455a8e1439 |
Hashes for pragzip-0.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d7db9ace0b9dd3760da292adde05a921486a7934cde0d98380de1eb618aafce3 |
|
MD5 | 4f4c38ac9df24b22df98a0edf82d08c9 |
|
BLAKE2b-256 | 8f5149d68a6277d475a1e4f0c89785ec17d0a4fead61a1e613753d9a32030e9c |
Hashes for pragzip-0.5.0-cp39-cp39-macosx_10_14_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f2e1fc5c9fa9511429e91b0fe9cdfbf6ff94ca70da75e624fed9d0b972b9bc83 |
|
MD5 | a486259c58e9473031ddc6615a0f5776 |
|
BLAKE2b-256 | a1246f610176b2dbbd121a0845a3ec314d42d6bf43b2050abd9d3a051d6e89a2 |
Hashes for pragzip-0.5.0-cp38-cp38-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 31e778a3dd1539e2ec0b535a1cfceea011be6c788e04110bee76c4badb1a4421 |
|
MD5 | ffb1055817a872a2f79fb7d5f0013b7d |
|
BLAKE2b-256 | a24417eaeed49df8134bdbea29e7d4df5890201189d5c210d56c78a71605da5f |
Hashes for pragzip-0.5.0-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3eb8964b4eaf68f15401990ca0316bb257c470d68a8c66ad08afebe1676dc289 |
|
MD5 | de6484e666e129a09ce0a51e93dad456 |
|
BLAKE2b-256 | eb1bc3dd7e14aae616e1da4dbfcf5c674d2c1db21be1f5d34fe6fca31b17b555 |
Hashes for pragzip-0.5.0-cp38-cp38-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7acd6b50e49c9209289afc9122acd51458c392b114d8383089660737f01fc7f1 |
|
MD5 | 55691028be5b0416092ce35eafebfc21 |
|
BLAKE2b-256 | 540375ae209ca4f78267a03bd71069ccf6ff4e912952b0330cb823af88208198 |
Hashes for pragzip-0.5.0-cp38-cp38-manylinux_2_28_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 496371a7d2cd886c3220a0b45b3d4ab09dbb7389e6768272383a17c891c100e7 |
|
MD5 | c9ea92a040aa1c98168d5b3458625b17 |
|
BLAKE2b-256 | b622fc7f0aab64121af4256357a84a2d8fada51bbfd266557af3f1f1dcfc0ae0 |
Hashes for pragzip-0.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1506daffb223325111b2489c6e56f4f0e9351f8ab2397a6b4c5a7fb7fca27d41 |
|
MD5 | 485dbdb1cfae990c379cb0262b276a5b |
|
BLAKE2b-256 | aae81c15440b22d5f46d82ec5233279ca26ddc7a0472b509374cf28c80a8abd8 |
Hashes for pragzip-0.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ea95d489948987e4842c831e8e19f786544e7f9c9cb3502a6ebbe85d910a52d9 |
|
MD5 | bfa0f08b2b537b2afedb121f49c03faa |
|
BLAKE2b-256 | cfc0850456be4a47498652f2ee2dd5873431921198f258ea9ff26dc17d6078e2 |
Hashes for pragzip-0.5.0-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 20b67252d88a0180d9bb6f35a26d8671afe7480fba6f2395392a87b5daebc341 |
|
MD5 | a836539f00775de246b5724cb5de6f9e |
|
BLAKE2b-256 | 451bcfef79448f0a8ef18633ae861d0c5d6a1153b40417b04edc24e33cd225aa |
Hashes for pragzip-0.5.0-cp37-cp37m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2cfc840fef5d17f284ad8e58d0886c6d7d02731b27faf2b3b076f53630ef5e86 |
|
MD5 | 79ac7d3854247fe2539d320603f19e24 |
|
BLAKE2b-256 | 9f4e3eda4aa17625375f437954f23ac611a17ff3905440d6889ece5494b4d4d2 |
Hashes for pragzip-0.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 677a064023c2b6d69db3469943196bf114c69545754a34cd15ae839a7ec3c7a6 |
|
MD5 | d2eb68bef1eaefd7cc8030fc10acd2fd |
|
BLAKE2b-256 | 6000d9c9e30213fc081b1ada24248f16e30b187b53b06f2df1ae49a1c451865e |
Hashes for pragzip-0.5.0-cp37-cp37m-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ad693680d8624a329e2ec5ac4abb5843e20daa3b81d389511052ee1c5f6b5dfe |
|
MD5 | c41f543c2409fbe666b79dec6f24d289 |
|
BLAKE2b-256 | b504dd7a39dbb6439e1f4aa86a6b5a58c5faeed80fcca9ffb262c02118331fdb |
Hashes for pragzip-0.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | fddbe14cb458c7f92af02f314ae195566ca904e853a66654c063782eb7bd3227 |
|
MD5 | 2627167c07dfeb23c715ab2ef1a29c79 |
|
BLAKE2b-256 | f12f9bc74989e02183a8bd110ceb7697a6880d7c9a0c1126506fcfa3df95923b |
Hashes for pragzip-0.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8aa4222f005835304a4fbce3356f38476cb8b8c4e8cea26614845e216c508685 |
|
MD5 | 425dfe598e3025628763a90e11e0050b |
|
BLAKE2b-256 | 42f5eae2aa1373ced4141586ed80944bc82fbc6fbd6c44bfc03f75d35214b8dd |
Hashes for pragzip-0.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 19bff1b3cb7d10c3e56ccb489a8f3c126e03fd97b14b61a032ce1c9f6206bfc5 |
|
MD5 | ff13186ec82c2b4441ef6897b36f54ad |
|
BLAKE2b-256 | caa9a36c4f76c4cadf8a97af97378b3b2424e70aed161c6395f1598034240ae7 |
Hashes for pragzip-0.5.0-cp37-cp37m-macosx_10_14_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7633ff6402804f14b341d736eb0e484232c53c8418c1303cb4801dbf72730166 |
|
MD5 | 8e7003107dcb88003a943543d619d50e |
|
BLAKE2b-256 | 316a5d0298c68cdc0beba44c58602d28488dc90909dc822db0a1361e556d13b6 |
Hashes for pragzip-0.5.0-cp36-cp36m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8fd11891dc3aef3242de50d132e7f39390f22f03a3736e2876b89d5389483a1c |
|
MD5 | 1ecfba1fd50c5e49ae6faa6293aad7c5 |
|
BLAKE2b-256 | b21a6264974118e63bd6ad065d97b1c91582aa26c96be4c5ee6f3a23f8af2c50 |
Hashes for pragzip-0.5.0-cp36-cp36m-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 95a6c5e0d9530e9a8447ce2c7d06b59a260bc47185d5439c16b1e12ab654012b |
|
MD5 | 4e555d2c2ba01383bbb8c50e737da45d |
|
BLAKE2b-256 | 6e918182b5473be4e51f742dd3ded024e9e002c2113de56a46bbc89a41ef4db9 |
Hashes for pragzip-0.5.0-cp36-cp36m-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6002a805a97ad2b80ed87daa797ece32124f3a0b49f7c632286a99b0b9f8a713 |
|
MD5 | 95ccba7bc59bea999304f9c5d65412bc |
|
BLAKE2b-256 | 4da2901c6effc3d4407b24fc19d26583af0e76307137a874ec8175fa95792189 |
Hashes for pragzip-0.5.0-cp36-cp36m-manylinux_2_28_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 93103c07ba397fa35ddc7b37f8fef6dc5cb3df24421797d3d35ed70b049ae9e4 |
|
MD5 | cf0d4f75e3b4a89bcdcc52d3c99e05c9 |
|
BLAKE2b-256 | 1884835115d444f3c5f3dbad15ebcec24753a223382701b47894f8dec90c8eab |
Hashes for pragzip-0.5.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d517c5bcf9cd646adc403bce56baf5c7b14288382b128d3ecba478a920b16fff |
|
MD5 | 3b948050c4df7b22d138c779ffebcb5f |
|
BLAKE2b-256 | b9f7909b76e373d439b8583171d0874b0a1eda43acbe6c32aa30c60f0dc9ca6d |
Hashes for pragzip-0.5.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a7cc4f9585a0246f9726ad8b5e84041d2216cad5290845055bf6a686c2350990 |
|
MD5 | c77e50627c76ffefea04a8da2997fc56 |
|
BLAKE2b-256 | f1128fe16f8f12f60c6f40553e7e4e92d203bf3321d95bcf96bdaa974a60322a |
Hashes for pragzip-0.5.0-cp36-cp36m-macosx_10_14_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | bcbd1e5d637b6ba08a22424d77cd0c9cf7320c45ac044ad875959bf97ef37bef |
|
MD5 | a320324d0605ddd31e42cb71639c689c |
|
BLAKE2b-256 | 0a319e316dec16f39d0de897344b3a706a8ebc33253f8c3e1aacac8c34f4c33a |