deflate — deflate kompresija i dekompresija¶
Ovaj modul omogućuje kompresiju i dekompresiju binarnih podataka pomoću DEFLATE algoritma (uobičajeno korištenog u zlib biblioteci i gzip arhiveru). Dodano u MicroPython v1.21.
Dostupnost na pločama koje podržava OpenMV:
Ploča |
Dekompresija |
Kompresija |
|---|---|---|
OpenMV Cam N6 |
Da |
Ne |
OpenMV AE3 |
Da |
Da |
OpenMV Cam RT1062 |
Da |
Da |
OpenMV Cam Pure Thermal |
Da |
Ne |
OpenMV Cam M4 |
Da |
Ne |
OpenMV Cam M7 |
Da |
Ne |
OpenMV Cam H7 |
Da |
Ne |
OpenMV Cam H7 Plus |
Da |
Ne |
Arduino Giga |
Da |
Ne |
Arduino Portenta H7 |
Da |
Ne |
Arduino Nicla Vision |
Da |
Ne |
Arduino Nano 33 BLE Sense |
Da |
Ne |
Arduino Nano RP2040 Connect |
Da |
Ne |
Klase¶
- class deflate.DeflateIO(stream: Any, format: int = AUTO, wbits: int = 0, close: bool = False, /)¶
Ova klasa može se koristiti za omatanje stream objekta koji je bilo koji objekt nalik streamu poput datoteke, socketa ili streama (uključujući
io.BytesIO). I sama je stream i implementira standardne metode read/readinto/write/close.stream mora biti blokirajući stream. Neblokirajući streamovi trenutno nisu podržani.
format može se postaviti na bilo koju od dolje definiranih konstanti i zadano je
AUTOkoji će za dekompresiju automatski prepoznati gzip ili zlib streamove, a za kompresiju će generirati sirovi stream.Parametar wbits postavlja logaritam po bazi 2 veličine prozora rječnika DEFLATE. Tako, na primjer, postavljanje wbits na
10postavlja veličinu prozora na 1024 bajta. Valjane vrijednosti su od5do15uključivo (što odgovara veličinama prozora od 32 do 32k bajta).Ako je wbits postavljen na
0(zadano), tada će se za kompresiju koristiti veličina prozora od 256 bajtova (kao da je wbits postavljen na 8). Za dekompresiju ovisi o formatu:RAWće koristiti 256 bajtova (što odgovara wbits postavljenom na 8).ZLIB(iliAUTOs prepoznatim zlibom) koristit će vrijednost iz zlib zaglavlja.GZIP(iliAUTOs prepoznatim gzipom) koristit će 32 kilobajta (što odgovara wbits postavljenom na 15).
Pogledajte napomene o veličini prozora u nastavku za više informacija o veličini prozora te zlib i gzip streamovima.
Ako je close postavljen na
True, tada će se temeljni stream automatski zatvoriti kada se zatvori streamdeflate.DeflateIO. To je korisno ako želite vratitideflate.DeflateIOstream koji omata drugi stream, a da pozivatelj ne mora znati za upravljanje temeljnim streamom.Ako je kompresija omogućena, dana instanca
deflate.DeflateIOpodržava i čitanje i pisanje. Na primjer, dvosmjerni stream poput socketa može se omotati, što omogućuje kompresiju/dekompresiju u oba smjera.
Konstante¶
Četiri format konstante odabiru okvir primijenjen oko sirovog deflate bit-streama.
- deflate.AUTO: int¶
Za dekompresiju, automatski prepoznaje ulazni format pregledom prvih bajtova streama (zlib ili gzip). Za kompresiju, generira sirovi deflate stream bez zaglavlja ili završetka (jednako kao
RAW).
- deflate.RAW: int¶
Sirovi deflate stream (bez zaglavlja, bez završetka, bez kontrolne sume). Budući da stream ne sadrži metapodatke, dekompresor ne može oporaviti veličinu prozora iz podataka, pa bi wbits trebalo eksplicitno postaviti pri dekompresiji – inače zadani prozor od 256 bajtova može biti premalen.
- deflate.ZLIB: int¶
Deflate stream omotan zlibom kako je definirano u RFC 1950: 2-bajtno zaglavlje koje bilježi veličinu prozora, deflate korisni teret i završna Adler-32 kontrolna suma. Kompaktan i samoopisujući; dobro prikladan za ugrađenu uporabu.
- deflate.GZIP: int¶
Deflate stream omotan gzipom kako je definirano u RFC 1952: zaglavlje s neobaveznim metapodacima o imenu datoteke/vremenskoj oznaci, deflate korisni teret i završni CRC-32 plus nekomprimirana duljina. Ovo je format koji proizvodi naredbeni alat
gzipigzip.GzipFile. Zaglavlje ne bilježi veličinu prozora, pa dekompresor mora pretpostaviti 32 KiB osim ako je wbits postavljen.
Primjeri¶
Tipičan slučaj uporabe za deflate.DeflateIO je čitanje ili pisanje komprimirane datoteke iz pohrane:
import deflate
# Writing a zlib-compressed stream (uses the default window size of 256 bytes).
with open("data.z", "wb") as f:
with deflate.DeflateIO(f, deflate.ZLIB) as d:
# Use d.write(...) etc
# Reading a zlib-compressed stream (auto-detect window size).
with open("data.z", "rb") as f:
with deflate.DeflateIO(f, deflate.ZLIB) as d:
# Use d.read(), d.readinto(), etc.
Budući da je deflate.DeflateIO stream, može se koristiti na primjer s json.dump() i json.load() (i na svim drugim mjestima gdje se streamovi mogu koristiti):
import deflate, json
# Write a dictionary as JSON in gzip format, with a
# small (64 byte) window size.
config = { ... }
with open("config.gz", "wb") as f:
with deflate.DeflateIO(f, deflate.GZIP, 6) as f:
json.dump(config, f)
# Read back that dictionary.
with open("config.gz", "rb") as f:
with deflate.DeflateIO(f, deflate.GZIP, 6) as f:
config = json.load(f)
Ako vaši izvorni podaci nisu u stream formatu, možete koristiti io.BytesIO da ih pretvorite u stream prikladan za uporabu s deflate.DeflateIO:
import deflate, io
# Decompress a bytes/bytearray value.
compressed_data = get_data_z()
with deflate.DeflateIO(io.BytesIO(compressed_data), deflate.ZLIB) as d:
decompressed_data = d.read()
# Compress a bytes/bytearray value.
uncompressed_data = get_data()
stream = io.BytesIO()
with deflate.DeflateIO(stream, deflate.ZLIB) as d:
d.write(uncompressed_data)
compressed_data = stream.getvalue()
Veličina prozora deflate¶
Veličina prozora ograničava koliko unazad u streamu (de)kompresor može referencirati. Povećanje veličine prozora poboljšat će kompresiju, ali će zahtijevati više memorije i učiniti kompresor sporijim.
Ako je ulazni stream komprimiran danom veličinom prozora, tada će DeflateIO koji koristi manju veličinu prozora podbaciti tijekom dekompresije s OSError, ali samo ako se povratna referenca zaista odnosi unazad dalje od veličine prozora dekompresora. To znači da je možda moguće dekompresirati s manjom veličinom prozora. Na primjer, to bi trivijalno bio slučaj ako su izvorni nekomprimirani podaci kraći od veličine prozora.
Dekompresija¶
zlib format uključuje zaglavlje koje navodi veličinu prozora korištenu za kompresiju podataka. To ukazuje na maksimalnu veličinu prozora potrebnu za dekompresiju ovog streama. Ako je ta vrijednost zaglavlja manja od navedene vrijednosti wbits (ili ako wbits nije postavljen), tada će se koristiti vrijednost zaglavlja.
gzip format ne uključuje veličinu prozora u zaglavlju i pretpostavlja da svi gzip kompresori (npr. uslužni program gzip ili CPythonova implementacija gzip.GzipFile) koriste maksimalnu veličinu prozora od 32kiB. Iz tog razloga, ako parametar wbits nije postavljen, dekompresor će koristiti veličinu prozora od 32 kiB (što odgovara wbits postavljenom na 15). To znači da za mogućnost dekompresije proizvoljnog gzip streama morate imati barem toliko dostupnog RAM-a. Ako kontrolirate izvorne podatke, razmotrite umjesto toga korištenje zlib formata s manjom veličinom prozora.
Sirovi format nema zaglavlje i stoga ne uključuje nikakve informacije o veličini prozora. Ako wbits nije postavljen, zadat će se na veličinu prozora od 256 bajtova, što možda nije dovoljno veliko za dani stream. Stoga se preporučuje da uvijek eksplicitno postavite wbits ako koristite sirovi format.
Kompresija¶
Za kompresiju, MicroPython će kao zadano koristiti veličinu prozora od 256 bajtova za sve formate. To pruža razumnu količinu kompresije uz minimalno korištenje memorije i brzo vrijeme kompresije te će generirati izlaz koji će raditi s bilo kojim dekompresorom.