Scroll to navigation

XZ(1) Utilități XZ XZ(1)

NUME

xz, unxz, xzcat, lzma, unlzma, lzcat - Comprimă sau decomprimă fișiere .xz și .lzma

REZUMAT

xz [opțiune...] [fișier...]

ALIAS COMENZI

unxz este echivalent cu xz --decompress.
xzcat este echivalent cu xz --decompress --stdout.
lzma este echivalent cu xz --format=lzma.
unlzma este echivalent cu xz --format=lzma --decompress.
lzcat este echivalent cu xz --format=lzma --decompress --stdout.

Când scrieți scripturi care trebuie să decomprime fișiere, este recomandat să folosiți întotdeauna comanda xz cu argumentele adecvate (xz -d sau xz -dc) în loc de comenzile unxz și xzcat.

DESCRIERE

xz este un instrument de comprimare a datelor de uz general cu sintaxă de linie de comandă similară cu gzip(1) și bzip2(1). Formatul de fișier nativ este formatul .xz, dar formatul vechi .lzma folosit de LZMA Utils și fluxurile comprimate brute fără anteturi de format container sunt de asemenea acceptate. În plus, este acceptată decomprimarea formatului .lz folosit de lzip.

xz comprimă sau decomprimă fiecare fișier în funcție de modul de operare selectat. Dacă nu sunt date fișiere sau fișier este -, xz citește de la intrarea standard și scrie datele procesate la ieșirea standard. xz va refuza (afișează o eroare și omite fișier) să scrie date comprimate la ieșirea standard dacă este un terminal. În mod similar, xz va refuza să citească datele comprimate de la intrarea standard dacă este un terminal.

Cu excepția cazului în care este specificată opțiunea --stdout, fișierele altele decât - sunt scrise într-un fișier nou al cărui nume este derivat din numele fișierului sursă:

  • La comprimare, sufixul formatului de fișier țintă (.xz sau .lzma) este atașat la numele fișierului sursă pentru a se obține numele fișierului țintă.
  • La decomprimare, sufixul .xz, .lzma sau .lz este eliminat din numele fișierului pentru a se obține numele fișierului țintă. xz recunoaște și sufixele .txz și .tlz și le înlocuiește cu sufixul .tar.

Dacă fișierul țintă există deja, este afișată o eroare și fișier este omis.

Cu excepția cazului în care scrie la ieșirea standard, xz va afișa un avertisment și va omite fișierul dacă se aplică oricare dintre următoarele:

  • Fișierul nu este un fișier obișnuit. Legăturile simbolice nu sunt urmate și, prin urmare, nu sunt considerate fișiere obișnuite.
  • Fișierul are mai mult de o legătură dură.
  • Fișierul are activat bitul «setuid», «setgid» sau cel lipicios(sticky).
  • Modul de operare este stabilit la comprimare și fișier are deja un sufix al formatului de fișier țintă (.xz sau .txz când se comprimă în formatul .xz și .lzma sau .tlz când se comprimă în formatul .lzma).
  • Modul de operare este stabilit la decomprimare și fișierul nu are un sufix al niciunui format de fișier acceptat (.xz, .txz, .lzma, .tlz, sau .lz).

După comprimarea sau decomprimarea cu succes a fișierului, xz copiază proprietarul, grupul, permisiunile, timpul de acces și timpul de modificare din fișierul sursă în fișierul țintă. Dacă copierea grupului eșuează, permisiunile sunt modificate astfel încât fișierul țintă să nu devină accesibil utilizatorilor care nu aveau permisiunea de a accesa fișierul sursă. xz nu acceptă încă copierea altor metadate, cum ar fi listele de control al accesului sau atributele extinse.

Odată ce fișierul țintă a fost închis cu succes, fișierul sursă este eliminat dacă nu a fost specificată opțiunea --keep. Fișierul sursă nu este niciodată eliminat dacă rezultatul este scris la ieșirea standard sau dacă apare o eroare.

Trimiterea unui semnal SIGINFO sau SIGUSR1 către procesul xz face ca acesta să imprime informații despre progres la ieșirea de eroare standard. Acest lucru are o utilizare limitată, deoarece atunci când ieșirea de eroare standard este un terminal, folosind opțiunea --verbose va afișa un indicator de progres de actualizare automată.

Utilizarea memoriei

Cantitatea de memorie utilizată de xz variază de la câteva sute de kiloocteți la câțiva gigaocteți, în funcție de opțiunile de comprimare. Opțiunile utilizate la comprimarea unui fișier determină cerințele de memorie ale instrumentului de decomprimare. De obicei, instrumentul de decomprimare are nevoie de 5% până la 20% din cantitatea de memorie de care a avut nevoie instrumentul de comprimare la crearea fișierului. De exemplu, decomprimarea unui fișier creat cu xz -9 necesită în prezent 65Mio de memorie. Totuși, este posibil să aveți fișiere .xz care necesită câțiva gigaocteți de memorie pentru decomprimare.

În special utilizatorii de sisteme mai vechi pot considera deranjantă posibilitatea unei utilizări foarte mari a memoriei. Pentru a preveni surprizele neplăcute, xz are încorporat un limitator de utilizare a memoriei, care este dezactivat implicit. În timp ce unele sisteme de operare oferă modalități de a limita utilizarea memoriei proceselor, bazarea pe aceasta nu a fost considerată a fi suficient de flexibilă (de exemplu, utilizarea ulimit(1) pentru a limita memoria virtuală tinde să paralizeze mmap(2)).

Limitatorul de utilizare a memoriei poate fi activat cu opțiunea din linia de comandă --memlimit=limita. Adesea este mai convenabil să activați limitatorul în mod implicit prin definirea variabilei de mediu XZ_DEFAULTS, de exemplu, XZ_DEFAULTS=--memlimit=150MiB. Este posibil să stabiliți limitele separat pentru comprimare și decomprimare folosind --memlimit-compress=limita și --memlimit-decompress=limita. Utilizarea acestor două opțiuni în afara XZ_DEFAULTS este foarte rar utilă, deoarece o singură rulare a xz nu poate face atât comprimarea, cât și decomprimarea și --memlimit=limita (sau -M limita ) este mai scurt de tastat pe linia de comandă.

Dacă limita de utilizare a memoriei specificată este depășită la decomprimare, xz va afișa o eroare și decomprimarea fișierului va eșua. Dacă limita este depășită la comprimare, xz va încerca să reducă valorile stabilite astfel încât limita să nu mai fie depășită (cu excepția cazului în care se utilizează opțiunea --format=raw sau --no-adjust). În acest fel, operațiunea nu va eșua decât dacă limita stabilită este foarte mică. Scalarea valorilor stabilite se face în pași care nu se potrivesc cu valorile prestabilite ale nivelului de comprimare, de exemplu, dacă limita este doar puțin mai mică decât cantitatea necesară pentru xz -9, valorile stabilite vor fi reduse doar puțin , nu până la valoarea prestabilită a lui xz -8.

Concatenare și completare (prin umplere cu octeți nuli) cu fișiere .xz

Este posibil să concatenați fișierele .xz așa cum sunt. xz va decomprima astfel de fișiere ca și cum ar fi un singur fișier .xz.

Este posibil să se introducă umplutură între părțile concatenate sau după ultima parte. Umplutura trebuie să fie compusă din octeți nuli, iar dimensiunea umpluturii trebuie să fie un multiplu de patru octeți. Acest lucru poate fi util, de exemplu, dacă fișierul .xz este stocat pe un mediu care măsoară dimensiunile fișierelor în blocuri de 512 de octeți.

Concatenarea și completarea nu sunt permise cu fișierele .lzma sau fluxurile brute.

OPȚIUNI

Sufixe de numere întregi și valori speciale

În majoritatea locurilor în care este de așteptat un număr întreg ca argument, un sufix opțional este acceptat pentru a indica cu ușurință numerele întregi mari. Nu trebuie să existe spațiu între numărul întreg și sufix.

Înmulțește numărul întreg cu 1.024 (2^10). Ki, k, kB, K și KB sunt acceptate ca sinonime pentru KiB.
Înmulțește numărul întreg cu 1,048,576 (2^20). Mi, m, M, și MB sunt acceptate ca sinonime pentru MiB.
Înmulțește numărul întreg cu 1,073,741,824 (2^30). Gi, g, G, și GB sunt acceptate ca sinonime pentru GiB.

Valoarea specială max poate fi utilizată pentru a indica valoarea maximă întreagă suportată de opțiune.

Mod de operare

Dacă sunt date mai multe opțiuni de mod de funcționare, ultima dintre ele, este cea care va avea efect.

Comprimare. Acesta este modul de operare implicit atunci când nu este specificată nicio opțiune de mod de funcționare și nici un alt mod de operare nu este implicat din numele comenzii (de exemplu, unxz implică --decompress).
Decomprimare.
Testează integritatea fișierelor comprimate. Această opțiune este echivalentă cu --decompress --stdout cu excepția faptului că datele decomprimate sunt înlăturate în loc să fie scrise la ieșirea standard. Nu sunt create sau eliminate fișiere.
Afișează informații despre fișiere comprimate. Nu are loc nicio decomprimare la ieșire și nu sunt create sau eliminate fișiere. În modul listă, programul nu poate citi datele comprimate din intrarea standard sau din alte surse care nu pot fi căutate.
Listarea implicită arată informații de bază despre fișiere, câte un fișier pe linie. Pentru a obține informații mai detaliate, utilizați și opțiunea --verbose. Pentru și mai multe informații, utilizați opțiunea --verbose de două ori, dar rețineți că acest lucru poate fi lent, deoarece obținerea tuturor informațiilor suplimentare necesită multe căutări. Lățimea ieșirii detaliate depășește 80 de caractere, deci canalizarea ieșirii către, de exemplu, less -S poate fi convenabilă dacă terminalul nu este suficient de lat.
Ieșirea exactă poate varia între versiunile xz și diferitele localizări(configurările regionale). Pentru ieșiri care pot fi citite de mașină, ar trebui utilizată opțiunea --robot --list.

Modificatori de operare

Nu șterge fișierele de intrare.
Începând cu xz 5.2.6, această opțiune face ca xz să comprime sau să decomprime, chiar dacă intrarea este o legătură simbolică către un fișier obișnuit, are mai mult de-o legătură dură sau are marcați biții setuid, setgid sau bitul lipicios. Biții setuid, setgid și bitul lipicios nu sunt copiați în fișierul țintă. În versiunile anterioare acest lucru se făcea numai cu ajutorul opțiunii --force.
Această opțiune are mai multe efecte:
  • Dacă fișierul țintă există deja, îl șterge înainte de comprimare sau decomprimare.
  • Comprimă sau decomprimă chiar dacă intrarea este o legătură simbolică către un fișier obișnuit, are mai mult de-o legătură dură sau are marcați biții setuid, setgid sau bitul lipicios. Biții setuid, setgid și bitul lipicios nu sunt copiați în fișierul țintă.
  • Când este utilizată cu opțiunile --decompress și --stdout, comanda xz nu poate recunoaște tipul fișierului sursă, și copiază fișierul sursă așa cum este la ieșirea standard. Acest lucru permite comenzii xzcat --force să fie folosită drept comanda cat(1) pentru fișierele care nu au fost comprimate cu xz. Rețineți că, în viitor, xz ar putea să accepte noi formate de fișiere comprimate, ceea ce poate face ca xz să decomprime mai multe tipuri de fișiere în loc să le copieze așa cum sunt la ieșirea standard. Opțiunea --format=format poate fi folosită pentru a restricționa xz să decomprime doar un singur format de fișier.
Scrie datele comprimate sau decomprimate la ieșirea standard în loc de într-un fișier. Aceasta implică --keep.
Decomprimă numai primul flux .xz și ignoră în tăcere posibilele date de intrare rămase în urma fluxului. În mod normal, astfel de resturi rămase face ca xz să afișeze o eroare.
xz nu decomprimă niciodată mai mult de un flux din fișierele .lzma sau din fluxurile brute, dar această opțiune face ca xz să ignore posibilele resturi de date rămase după fișierul .lzma sau fluxul brut.
Această opțiune nu are efect dacă modul de funcționare nu este --decompress sau --test.
Dezactivează crearea de fișiere dispersate. În mod implicit, dacă decomprimă într-un fișier obișnuit, xz încearcă să facă fișierul dispersat dacă datele decomprimate conțin secvențe lungi de zerouri binare. De asemenea, funcționează atunci când scrie la ieșirea standard, atâta timp cât ieșirea standard este conectată la un fișier obișnuit și sunt îndeplinite anumite condiții suplimentare pentru a o face în siguranță. Crearea de fișiere dispersate poate economisi spațiu pe disc și poate accelera decomprimarea prin reducerea cantității de date de In/Ieș pe disc.
Când comprimă, utilizează .suf ca sufix pentru fișierul țintă în loc de .xz sau .lzma. Dacă nu scrie la ieșirea standard și fișierul sursă are deja sufixul .suf, este afișat un avertisment și fișierul este omis.
Când decomprimă, recunoaște fișierele cu sufixul .suf în plus față de fișierele cu sufixul .xz, .txz, .lzma, .tlz sau .lz. Dacă fișierul sursă are sufixul .suf, sufixul este eliminat pentru a obține numele fișierului țintă.
La comprimarea sau decomprimarea fluxurilor brute (--format=raw), sufixul trebuie să fie întotdeauna specificat, cu excepția cazului în care se scrie la ieșirea standard, deoarece nu există un sufix implicit pentru fluxurile brute.
Citește numele fișierelor de procesat din fișier; dacă fișierul este omis, numele fișierelor sunt citite de la intrarea standard. Numele de fișiere trebuie să fie terminate cu caracterul de linie nouă. O liniuță (-) este luată ca nume de fișier obișnuit; nu înseamnă intrarea standard. Dacă numele de fișiere sunt date și ca argumente în linia de comandă, ele sunt procesate înainte ca numele fișierelor să fie citite din fișier.
Această opțiune este identică cu --files[=fișier], cu excepția faptului că fiecare nume de fișier trebuie să fie terminat cu caracterul nul.

Formatul de bază al fișierului și opțiunile de comprimare

Specifică formatul fișierului pentru comprimare sau decomprimare:
Aceasta este valoarea implicită. La comprimare, auto este echivalent cu xz. La decomprimare, formatul fișierului de intrare este detectat automat. Rețineți că fluxurile brute (create cu --format=raw) nu pot fi detectate automat.
Comprimă în formatul de fișier .xz sau acceptă numai fișierele .xz când decomprimă.
Comprimă în formatul de fișier .lzma vechi sau acceptă numai fișierele .lzma când decomprimă. Numele alternativ alone este furnizat pentru compatibilitatea cu versiunile mai vechi de LZMA Utils.
Acceptă numai fișierele .lz când decomprimă. Comprimarea nu este acceptată.
Formatul .lz versiunea 0 și versiunea neextinsă 1 sunt acceptate. Fișierele versiunea 0 au fost produse de lzip cu versiunea 1.3 sau mai veche. Astfel de fișiere nu sunt obișnuite, dar pot fi găsite în arhivele de fișiere, deoarece câteva pachete sursă au fost lansate în acest format. Oamenii ar putea avea și fișiere personale vechi în acest format. Suportul de decomprimare pentru versiunea de format 0 a fost eliminat în lzip 1.18.
lzip 1.4 și versiunile ulterioare creează fișiere în formatul versiunea 1. Extensia „sync flush marker” pentru versiunea 1 de format a fost adăugată în lzip 1.6. Această extensie este folosită rar și nu este acceptată de xz (diagnosticată ca intrare coruptă).
Comprimă sau decomprimă un flux brut (fără anteturi). Acest lucru este destinat doar utilizatorilor avansați. Pentru a decodifica fluxurile brute, trebuie să utilizați opțiunea --format=raw și să specificați în mod explicit lanțul de filtre, care în mod normal ar fi fost stocat în anteturile containerului.
Specifică tipul verificării integrității. Verificarea este calculată din datele necomprimate și stocată în fișierul .xz. Această opțiune are efect numai la comprimarea în format .xz; formatul .lzma nu acceptă verificări de integritate. Verificarea integrității (dacă există) este efectuată atunci când fișierul .xz este decomprimat.
Tipuri de verificare acceptate:
Nu calculează deloc o verificare a integrității. Aceasta este de obicei o idee proastă. Acest lucru poate fi util atunci când integritatea datelor este oricum verificată prin alte mijloace.
Calculează CRC32 folosind polinomul din IEEE-802.3 (Ethernet).
Calculează CRC64 folosind polinomul din ECMA-182. Aceasta este valoarea implicită, deoarece este ceva mai bună decât CRC32 la detectarea fișierelor deteriorate, iar diferența de viteză este neglijabilă.
Calculează SHA-256. Acest lucru este oarecum mai lent decât CRC32 și CRC64.
Integritatea antetelor .xz este întotdeauna verificată cu CRC32. Nu este posibilă modificarea sau dezactivarea acesteia.
Nu efectuează verificarea integrității datelor comprimate la decomprimare. Valorile CRC32 din antetele .xz vor fi însă verificate normal.
Nu utilizați această opțiune decât dacă știți ce faceți. Motive posibile pentru a utiliza această opțiune:
  • Încercarea de a recupera datele dintr-un fișier .xz corupt.
  • Accelerarea decomprimării. Acest lucru contează mai ales cu SHA-256 sau cu fișierele care s-au comprimat extrem de bine. Este recomandat să nu utilizați această opțiune în acest scop decât dacă integritatea fișierului este verificată extern într-un alt mod.
-0 ... -9
Selectează un nivel prestabilit de comprimare. Valoarea implicită este -6. Dacă sunt specificate mai multe niveluri prestabilite, ultimul are efect. Dacă a fost deja specificat un lanț de filtre personalizat, specificarea unui nivel prestabilit de comprimare șterge lanțul de filtre personalizat.
Diferențele dintre valorile prestabilite sunt mai semnificative decât cu gzip(1) și bzip2(1). Valorile de comprimare selectate determină cerințele de memorie ale instrumentului de decomprimare, astfel încât utilizarea unui nivel prea mare prestabilit ar putea face „dureroasă” decomprimarea fișierului pe un sistem vechi cu puțină memorie RAM. Mai exact, nu este o idee bună să folosiți orbește -9 pentru tot așa cum se întâmplă adesea cu gzip(1) și bzip2(1).
-0 ... -3
Acestea sunt valorile prestabilite oarecum rapide. -0 este uneori mai rapid decât gzip -9 în timp ce comprimă mult mai bine. Cele mai ridicate au adesea viteza comparabilă cu bzip2(1) cu un raport de comprimare comparabil sau mai bun, deși rezultatele depind foarte mult de tipul de date care sunt comprimate.
-4 ... -6
Comprimare bună spre foarte bună, păstrând în același timp utilizarea memoriei de către instrumentul de decomprimare la un nivel rezonabil chiar și pentru sistemele vechi. -6 este valoarea implicită, care este de obicei o alegere bună pentru distribuirea fișierelor care trebuie să poată fi decomprimate chiar și pe sisteme cu doar 16Mio de memorie RAM. Opțiunile (-5e sau -6e ar putea fi demne de luat în considerare. A se vedea opțiunea --extreme.)
-7 ... -9
Acestea sunt precum -6, dar cu cerințe mai mari de memorie pentru comprimare și decomprimare. Acestea sunt utile numai atunci când comprimați fișiere mai mari de 8Mio, 16Mio și, respectiv, 32Mio.
Pe același hardware, viteza de decomprimare este aproximativ un număr constant de octeți de date comprimate pe secundă. Cu alte cuvinte, cu cât comprimarea este mai bună, cu atât decomprimarea va fi de obicei mai rapidă. Aceasta înseamnă, de asemenea, că valoarea de la ieșire a cantității de date necomprimate produsă pe secundă poate varia foarte mult.
Următorul tabel rezumă caracteristicile valorilor prestabilite:

ValPrestab DimDict CPUComp MemComp MemDec
-0 256 KiB     0 3 MiB     1 MiB    
-1 1 MiB     1 9 MiB     2 MiB    
-2 2 MiB     2 17 MiB     3 MiB    
-3 4 MiB     3 32 MiB     5 MiB    
-4 4 MiB     4 48 MiB     5 MiB    
-5 8 MiB     5 94 MiB     9 MiB    
-6 8 MiB     6 94 MiB     9 MiB    
-7 16 MiB     6 186 MiB     17 MiB    
-8 32 MiB     6 370 MiB     33 MiB    
-9 64 MiB     6 674 MiB     65 MiB    
Descrieri coloane:
  • DimDict este dimensiunea dicționarului LZMA2. Este o risipă de memorie să folosești un dicționar mai mare decât dimensiunea fișierului necomprimat. De aceea este bine să evitați utilizarea valorilor prestabilite -7 ... -9 atunci când nu este nevoie cu adevărat de ele. Pentru valoarea prestabilită -6 sau alta mai mică, cantitatea de memorie irosită este de obicei suficient de mică pentru a nu conta.
  • CPUComp este o reprezentare simplificată a configurărilor LZMA2 care afectează viteza de comprimare. Dimensiunea dicționarului afectează și viteza, așa că, în timp ce CPUComp este aceeași pentru nivelurile -6 ... -9, nivelurile mai mari tind să fie puțin mai lente. Pentru a obține o comprimare și mai lentă și, astfel, posibil mai bună, consultați opțiunea --extreme.
  • MemComp conține cerințele de memorie ale comprimării în modul cu un singur fir de execuție. Poate varia ușor între versiunile xz.
  • MemDec conține cerințele de memorie pentru decomprimare. Adică, configurările de comprimare determină cerințele de memorie ale decomprimării. Cantitatea exactă a memoriei utilizate la decomprimare este puțin mai mare decât dimensiunea dicționarului LZMA2, dar valorile din tabel au fost rotunjite la următorul Mio.
Cerințele de memorie ale modului cu mai multe fire de execuție sunt semnificativ mai mari decât cele ale modului cu un singur fir de execuție. Cu valoarea implicită a lui --block-size, fiecare fir are nevoie de 3*3*DictSize plus MemComp sau MemDec. De exemplu, patru fire de execuție cu valoarea prestabilită -6 au nevoie de 660–670 Mio de memorie.
Utilizează o variantă mai lentă a nivelului prestabilit de comprimare selectat (-0 ... -9) pentru a obține un raport de comprimare puțin mai bun, dar din nefericire, acest lucru îl poate înrăutăți. Utilizarea memoriei pentru decomprimare nu este afectată, dar utilizarea memoriei la comprimare crește puțin la nivelurile prestabilite -0 ... -3.
Deoarece există două valori prestabilite cu dimensiuni ale dicționarului de 4Mio și 8Mio, valorile prestabilite -3e și -5e folosesc configurări puțin mai rapide (CPUComp mai mic) decât -4e și -6e, respectiv. În acest fel, nu există două nivele prestabilite identice.

ValPrestab DimDict CPUComp MemComp MemDec
-0e 256 KiB     8 4 MiB     1 MiB    
-1e 1 MiB     8 13 MiB     2 MiB    
-2e 2 MiB     8 25 MiB     3 MiB    
-3e 4 MiB     7 48 MiB     5 MiB    
-4e 4 MiB     8 48 MiB     5 MiB    
-5e 8 MiB     7 94 MiB     9 MiB    
-6e 8 MiB     8 94 MiB     9 MiB    
-7e 16 MiB     8 186 MiB     17 MiB    
-8e 32 MiB     8 370 MiB     33 MiB    
-9e 64 MiB     8 674 MiB     65 MiB    
De exemplu, există un total de patru nivele prestabilite care folosesc dicționarul 8Mio, a căror ordine de la cel mai rapid la cel mai lent este -5, -6, -5e și -6e .
Acestea sunt alias de opțiuni, oarecum înșelătoare pentru -0 și, respectiv, -9. Acestea sunt furnizate numai pentru compatibilitatea cu LZMA Utils. Evitați utilizarea acestor opțiuni.
Când comprimă în formatul .xz, împarte datele de intrare în blocuri de dimensiunea octeți. Blocurile sunt comprimate independent unul de celălalt, ceea ce ajută în modul cu mai multe fire de execuție și face posibilă decomprimarea cu acces aleatoriu limitat. Această opțiune este de obicei folosită pentru a suprascrie dimensiunea implicită a blocului în modul cu mai multe fire de execuție, dar această opțiune poate fi folosită și în modul cu un singur fir de execuție.
În modul cu mai multe fire de execuție, aproximativ de trei ori dimensiunea de octeți vor fi alocați în fiecare fir pentru stocarea intrării și ieșirii. Dimensiunea implicită este de trei ori dimensiunea dicționarului LZMA2 sau 1Mio, oricare dintre acestea este mai mare. În mod obișnuit, o valoare bună este de două la patru ori dimensiunea dicționarului LZMA2 sau de cel puțin 1Mio. Utilizarea unei dimensiuni mai mici decât dimensiunea dicționarului LZMA2 este o risipă de memorie RAM, deoarece atunci memoria tampon a dicționarului LZMA2 nu va fi niciodată utilizată pe deplin. În modul cu mai multe fire de execuție, dimensiunile blocurilor sunt stocate în anteturile blocurilor. Aceste informații privind dimensiunea sunt necesare pentru decomprimarea cu mai multe fire.
În modul cu un singur fir de execuție, nicio divizare a blocurilor nu se face în mod implicit. Folosirea acestei opțiuni nu afectează utilizarea memoriei. Nu sunt stocate informații despre dimensiune în antetele blocurilor, astfel încât fișierele create în modul cu un singur fir de execuție nu vor fi identice cu fișierele create în modul cu mai multe fire de execuție. Lipsa informațiilor privind dimensiunea înseamnă, de asemenea, că xz nu va putea decomprima fișierele în modul cu mai multe fire. de execuție.
Când comprimă în formatul .xz, începe un nou bloc cu un lanț de filtre personalizat opțional după intervalele specificate de date necomprimate.
elementele sunt o listă separată prin virgule. Fiecare element este format dintr-un număr opțional de lanț de filtrare între 0 și 9, urmat de două puncte (:) și de o dimensiune cerută a datelor necomprimate. Omiterea unui element (două sau mai multe virgule consecutive) este o prescurtare pentru a utiliza dimensiunea și filtrele din elementul anterior.
În cazul în care fișierul de intrare este mai mare decât suma dimensiunilor din elemente, ultimul element se repetă până la sfârșitul fișierului. O valoare specială de 0 poate fi utilizată ca ultimă dimensiune pentru a indica faptul că restul fișierului trebuie să fie codificat ca un singur bloc.
Un lanț de filtre alternativ pentru fiecare bloc poate fi specificat în combinație cu opțiunile --filters1=filtre ... --filters9=filtre. Aceste opțiuni definesc lanțuri de filtre cu un identificator cuprins între 1–9. Lanțul de filtre 0 poate fi utilizat pentru a se referi la lanțul de filtre implicit, ceea ce este același lucru cu a nu specifica un lanț de filtre. Identificatorul lanțului de filtre poate fi utilizat înaintea dimensiunii necomprimate, urmat de două puncte (:). De exemplu, dacă se specifică --block-list=1:2MiB,3:2MiB,2:4MiB,,2MiB,0:4MiB, atunci blocurile vor fi create folosind:
  • Lanțul de filtre specificat de --filters1 și 2 Mio de intrare
  • Lanțul de filtre specificat de --filters3 și 2 Mio de intrare
  • Lanțul de filtre specificat de --filters2 și 4 Mio de intrare
  • Lanțul de filtre specificat de --filters2 și 4 Mio de intrare
  • Lanțul de filtre implicit și 2 MiB de intrare
  • Lanțul de filtre implicit și 4 MiB de intrare pentru fiecare bloc până la sfârșitul intrării.
Dacă se specifică o dimensiune care depășește dimensiunea blocului codificatorului (fie valoarea implicită în modul cu fire de execuție, fie valoarea specificată cu --block-size=dimensiune), codificatorul va crea blocuri suplimentare, păstrând limitele specificate în elemente. De exemplu, dacă se specifică --block-size=10MiB --block-list=5MiB,10MiB,8MiB,12MiB,24MiB și fișierul de intrare este de 80 MiB, se vor obține 11 blocuri: 5, 10, 8, 10, 10, 2, 10, 10, 10, 4, 10, 10, 10 și 1 Mio.
În modul cu mai multe fire de execuție, dimensiunile blocurilor sunt stocate în antetele blocurilor. Acest lucru nu se face în modul cu un singur fir de execuție, astfel încât ieșirea codificată nu va fi identică cu cea a modului cu mai multe fire de execuție.
La comprimare, dacă au trecut mai mult de timp_limită milisecunde (un întreg pozitiv) de la curățarea anterioară și citirea mai multor intrări s-ar bloca, toate datele de intrare în așteptare sunt eliminate din codificator și puse la dispoziție în fluxul de ieșire. Acest lucru poate să fie util dacă xz este utilizat pentru a comprima datele care sunt transmise în flux printr-o rețea. Valorile mici de timp_limită fac datele disponibile la capătul de recepție cu o mică întârziere, dar valorile mari de timp_limită oferă un raport de comprimare mai bun.
Această caracteristică este dezactivată în mod implicit. Dacă această opțiune este specificată de mai multe ori, ultima este cea care se ia în considerare. Valoarea specială a lui timp_limită de 0, poate fi utilizată pentru a dezactiva în mod explicit această caracteristică.
Această caracteristică nu este disponibilă în sistemele non-POSIX.
Această caracteristică este încă experimentală. În prezent, xz este nepotrivit pentru decomprimarea fluxului în timp real datorită modului în care xz utilizează memoria tampon.
Stabilește o limită de utilizare a memoriei pentru comprimare. Dacă această opțiune este specificată de mai multe ori, ultima va avea efect.
Dacă parametrii de comprimare depășesc limita, xz va încerca să ajusteze parametrii scăzând valorile acestora, astfel încât limita să nu mai fie depășită și va afișa o notificare că ajustarea automată a fost efectuată. Ajustările se fac în această ordine: reducerea numărului de fire, trecerea la modul un singur fir de execuție dacă chiar și un singur fir în modul cu mai multe fire de execuție depășește limita și, în final, reducerea dimensiunii dicționarului LZMA2.
Când comprimă cu opțiunea --format=raw sau dacă a fost specificată opțiunea --no-adjust, numai numărul de fire poate fi redus, deoarece se poate face fără a afecta rezultatul comprimării.
Dacă limita nu poate fi îndeplinită chiar și cu ajustările descrise mai sus, este afișată o eroare și xz va ieși cu starea de ieșire 1.
Limita poate fi specificata în mai multe moduri:
  • Limita poate fi o valoare absolută în octeți. Utilizarea unui sufix întreg precum MiB poate fi utilă. De exemplu: --memlimit-compress=80MiB
  • Limita poate fi specificată ca procent din memoria fizică totală (RAM). Acest lucru poate fi util mai ales atunci când definiți variabila de mediu XZ_DEFAULTS într-un script de inițializare shell care este partajat între diferite calculatoare. În acest fel, limita este automat mai mare pe sistemele cu mai multă memorie. De exemplu: --memlimit-compress=70%
  • Limita poate fi restabilită la valoarea implicită dându-i valoarea 0. În prezent, aceasta este echivalentă cu stabilirea limitei la max (fără limită de utilizare a memoriei).
Pentru xz pe 32 de biți există un caz special: dacă limita ar fi peste 4020MiB, limita este stabilită la 4020MiB. Pe MIPS32 este stabilită în schimb la 2000MiB; (valorile 0 și max nu sunt afectate de acest lucru -- o caracteristică similară nu există pentru decomprimare). Acest lucru poate fi util atunci când un executabil pe 32 de biți are acces la un spațiu de adrese de 4Gio (2Gio pe MIPS32), se speră că nu produce daune în alte situații.
Consultați și secțiunea Utilizarea memoriei.
Stabilește o limită de utilizare a memoriei pentru decomprimare. Acest lucru afectează și modul --list. Dacă operațiunea nu este posibilă fără a depăși limita, xz va afișa o eroare și decomprimarea fișierului va eșua. Consultați --memlimit-compress=limita pentru modalitățile posibile de a specifica limita.
Stabilește o limită de utilizare a memoriei pentru decomprimarea cu mai multe fire de execuție. Acest lucru poate afecta doar numărul de fire de execuție; acest lucru nu îl va face niciodată pe xz să refuze decomprimarea unui fișier. Dacă limita este prea scăzută pentru a permite orice mod cu mai multe fire de execuție, limita este ignorată și xz va continua în modul cu un singur fir de execuție. Rețineți că, dacă se folosește și opțiunea --memlimit-decompress, se va aplica întotdeauna atât modurilor cu un singur fir de execuție, cât și modurilor cu mai multe fire de execuție și astfel limita efectivă pentru modul cu mai multe fire de execuție nu va fi niciodată mai mare decât limita stabilită cu opțiunea --memlimit-decompress.
Spre deosebire de celelalte opțiuni de limită de utilizare a memoriei, opțiunea --memlimit-mt-decompress=limita are o limită implicită specifică sistemului. Comanda xz --info-memory poate fi folosită pentru a vedea valoarea curentă.
Această opțiune și valoarea ei implicită există deoarece, fără nicio limită, decomprimarea cu (mai multe) fire de execuție ar putea ajunge să aloce o cantitate „nebună” de memorie cu unele fișiere de intrare. Dacă limita implicită este prea scăzută pe sistemul dumneavoastră, nu ezitați să creșteți limita, dar niciodată să nu o stabiliți la o valoare mai mare decât cantitatea de memorie RAM utilizabilă și cu niște fișiere de intrare adecvate, xz va încerca să utilizeze acea cantitate de memorie chiar și cu un număr redus de fire de execuție. Rularea lui xz cu depășirea cantității de memorie fizice(RAM) sau a celei de interschimb(swap) nu va îmbunătăți performanța de decomprimare.
Consultați opțiunea --memlimit-compress=limita pentru modalități posibile de a specifica limita. Stabilirea limitei la 0 restabilește limita la valoarea implicită specifică sistemului.
Aceasta este echivalentă cu specificarea opțiunilor: --memlimit-compress=limita --memlimit-decompress=limita --memlimit-mt-decompress=limita.
Afișează o eroare și iese dacă limita de utilizare a memoriei nu poate fi îndeplinită fără ajustarea parametrilor care afectează ieșirea comprimată. Adică, acest lucru împiedică xz să comute codificatorul din modul cu mai multe fire de execuție în modul cu un singur fir de execuție și să reducă dimensiunea dicționarului LZMA2. Chiar și atunci când această opțiune este utilizată, numărul de fire de execuție poate fi redus pentru a îndeplini limita de utilizare a memoriei, deoarece aceasta nu va afecta comprimarea.
Ajustarea automată este întotdeauna dezactivată la crearea fluxurilor brute (--format=raw).
Specifică numărul de fire de execuție de utilizat. Stabilirea numărului la valoarea specială 0, face ca xz să utilizeze până la atâtea fire de execuție câte procesoare sunt în sistem. Numărul real de fire de execuție poate fi mai mic decât număr dacă fișierul de intrare nu este suficient de mare pentru a trece la modul cu mai multe fire de execuție cu parametrii dați, sau dacă folosirea mai multor fire de execuție ar depăși limita de utilizare a memoriei.
Operațiile de comprimare cu un singur fir de execuție și cele cu mai multe fire de execuție produc ieșiri diferite. Comprimarea cu un singur fir de execuție va oferi cea mai mică dimensiune a fișierului, dar numai ieșirea de la comprimarea cu mai multe fire de execuție poate fi decomprimată folosind mai multe fire. Stabilirea numărului la 1 va determina ca xz să folosească modul cu un singur fir de execuție. Stabilirea numărului la orice altă valoare, inclusiv 0, va determina ca xz să folosească comprimarea cu mai multe fire de execuție chiar dacă sistemul acceptă doar un fir hardware; (xz 5.2.x folosește modul cu un singur fir de execuție în această situație).
Pentru a utiliza modul cu mai multe fire de execuție cu un singur fir, stabiliți numărul la +1. Prefixul + nu are efect cu alte valori decât 1. O limită de utilizare a memoriei poate face în continuare xz să treacă în modul cu un singur fir, cu excepția cazului în care este utilizată opțiunea --no-adjust. Suportul pentru prefixul + a fost adăugat în xz 5.4.0.
Dacă a fost solicitat un număr automat de fire și nu a fost specificată nicio limită de utilizare a memoriei, atunci o limită „maleabilă” implicită specifică sistemului va fi utilizată pentru a limita eventual numărul de fire de execuție. Este o limită „maleabilă” în sensul că este ignorată dacă numărul de fire devine unul, astfel o limită „maleabilă” nu va opri niciodată xz să comprime sau să decomprime. Această limită „maleabilă” implicită nu va face xz să treacă de la modul cu mai multe fire de execuție la modul cu un singur fir de execuție. Limitele active pot fi văzute rulând comanda xz --info-memory.
În prezent, singura metodă de procesare cu fire de execuție este împărțirea intrării în blocuri și comprimarea lor independent unul de celălalt. Dimensiunea implicită a blocului depinde de nivelul de comprimare și poate fi înlocuită cu opțiunea --block-size=dimensiune.
Decomprimarea cu fire de execuție funcționează numai pe fișierele care conțin mai multe blocuri cu informații despre dimensiune în antetele blocurilor. Toate fișierele suficient de mari comprimate în modul cu mai multe fire de execuție îndeplinesc această condiție, dar fișierele comprimate în modul cu un singur fir de execuție nu o îndeplinesc chiar dacă a fost folosită opțiunea --block-size=dimensiune.
Valoarea implicită pentru fire de execuție este 0. În xz 5.4.x și mai vechi, valoarea implicită este 1.

Lanțuri de filtrare personalizate pentru instrumentul de comprimare

Un lanț de filtrare personalizat permite specificarea parametrilor de comprimare în detaliu, în loc să se bazeze pe cei asociați opțiunilor prestabilite. Când este specificat un lanț de filtrare personalizat, opțiunile prestabilite (-0 ... -9 și --extreme) de mai devreme din linia de comandă sunt uitate. Dacă o opțiune prestabilită este specificată după una sau mai multe opțiuni de lanț de filtrare personalizat, noua prestabilire intră în vigoare și opțiunile lanțului de filtrare personalizat, specificate mai devreme sunt uitate.

Un lanț de filtrare este comparabil cu conductele din linia de comandă. La comprimare, intrarea necomprimată merge la primul filtru, a cărui ieșire merge la următorul filtru (dacă există). Ieșirea ultimului filtru este scrisă în fișierul comprimat. Numărul maxim de filtre din lanț este de patru, dar de obicei un lanț de filtrare are doar unul sau două filtre.

Multe filtre au limitări în ceea ce privește locul în care se pot afla în lanțul de filtrare: unele filtre pot funcționa doar ca ultimul filtru din lanț, altele doar ca non-ultim filtru și unele funcționează în orice poziție din lanț. În funcție de filtru, această limitare este fie inerentă proiectării filtrului, fie există pentru a preveni problemele de securitate.

Un lanț de filtre personalizat poate fi specificat în două moduri diferite. Opțiunile --filters=filtre și --filters1=filtre ... --filters9=filtre permit specificarea unui întreg lanț de filtre într-o singură opțiune, folosind sintaxa șirului de filtre liblzma. Alternativ, un lanț de filtre poate fi specificat prin utilizarea uneia sau mai multor opțiuni de filtrare individuale în ordinea în care sunt dorite în lanțul de filtre. Adică, ordinea opțiunilor de filtrare individuale este semnificativă! La decodificarea fluxurilor brute (--format=raw), lanțul de filtre trebuie să fie specificat în aceeași ordine în care a fost specificat la comprimare. Orice filtru individual sau opțiuni presetate specificate înainte de opțiunea de lanț complet (--filters=filtre) vor fi uitate. Filtrele individuale specificate după opțiunea „lanț complet” vor reinițializa lanțul de filtre.

Atât opțiunile de filtrare completă, cât și cele de filtrare individuală acceptă opțiuni specifice filtrului sub forma unei liste separate prin virgule. Se ignoră virgulele suplimentare din opțiuni. Fiecare opțiune are o valoare implicită, deci specificați-le pe cele pe care doriți să le modificați.

Pentru a vedea întregul lanț de filtre și opțiuni, utilizați xz -vv (adică folosiți --verbose de două ori). Acest lucru funcționează și pentru vizualizarea opțiunilor lanțului de filtre utilizate de valorile prestabilite.

Specificați întregul lanț de filtre sau o presetare într-o singură opțiune. Fiecare filtru poate fi separat prin spații sau două liniuțe (--). Este posibil să fie necesar ca filtrele să fie puse între ghilimele în linia de comandă a shell-ului pentru a fi analizate ca o singură opțiune. Pentru a indica opțiuni, utilizați : sau =. O presetare poate fi prefixată cu un - și urmată de zero sau mai multe indicatoare. Singurul indicator suportat este e pentru a aplica aceleași opțiuni ca și --extreme.
Specifică până la nouă lanțuri de filtre suplimentare care pot fi utilizate cu --block-list.
De exemplu, atunci când se comprimă o arhivă cu fișiere executabile urmate de fișiere text, partea executabilă ar putea utiliza un lanț de filtre cu un filtru BCJ, iar partea de text doar filtrul LZMA2.
Afișează un mesaj de ajutor care descrie modul de specificare a presetărilor și a lanțurilor de filtre personalizate în opțiunile --filters și --filters1=filtre ... --filters9=filtre și iese.
Adaugă filtrul LZMA1 sau LZMA2 la lanțul de filtre. Aceste filtre pot fi folosite doar ca ultimul filtru din lanț.
LZMA1 este un filtru vechi, care este acceptat aproape exclusiv datorită formatului de fișier vechi .lzma, care acceptă numai LZMA1. LZMA2 este o versiune actualizată a LZMA1 pentru a rezolva unele probleme practice ale LZMA1. Formatul .xz folosește LZMA2 și nu acceptă deloc LZMA1. Viteza de comprimare și rapoartele LZMA1 și LZMA2 sunt practic aceleași.
LZMA1 și LZMA2 au același set de opțiuni:
Reconfigurează toate opțiunile LZMA1 sau LZMA2 la prestabilit. prestabilit constă dintr-un număr întreg, care poate fi urmat de modificatori prestabiliți cu o singură literă. Numărul întreg poate fi de la 0 la 9, potrivindu-se cu opțiunile liniei de comandă -0 ... -9. Singurul modificator acceptat în prezent este e, care se potrivește cu --extreme. Dacă nu este specificat prestabilit, valorile implicite ale opțiunilor LZMA1 sau LZMA2 sunt preluate din prestabilirea 6.
Dimensiunea dicționarului (istoricul memoriei tampon) indică câți octeți din datele necomprimate recent procesate sunt păstrați în memorie. Algoritmul încearcă să găsească secvențe de octeți care se repetă (potriviri) în datele necomprimate și să le înlocuiască cu referințe la datele aflate în prezent în dicționar. Cu cât dicționarul este mai mare, cu atât este mai mare șansa de a găsi o potrivire. Astfel, creșterea dimensiunii dicționarului îmbunătățește de obicei raportul de comprimare, dar un dicționar mai mare decât fișierul necomprimat este risipă de memorie.
Dimensiuneatipică a dicționarului este de la 64Kio până la 64Mio. Minimul este de 4Kio. Maximul pentru compresie este în prezent de 1,5Gio (1536Mio). Decomprimarea acceptă deja dicționare cu până la un octet mai puțin de 4Gio, care este maximul pentru formatele de flux LZMA1 și LZMA2.
Dimensiunea dicționarului și găsitorul de potriviri (match finder) → (mf) determină împreună utilizarea memoriei de către codificatorul LZMA1 sau LZMA2. Aceeași dimensiune a dicționarului (sau mai mare) care a fost utilizată la comprimare, este necesară pentru decomprimare, astfel încât utilizarea memoriei de către decodificator este determinată de dimensiunea dicționarului utilizată la comprimare. Antetele .xz stochează dimensiunea dicționarului fie ca 2^n, fie ca 2^n + 2^(n-1), deci aceste dimensiuni sunt oarecum preferate pentru comprimare. Alte dimensiuni vor fi rotunjite atunci când sunt stocate în anteturile .xz.
Specifică numărul de biți de context literal. Minimul este 0 și maximul este 4; implicit este 3. În plus, suma lc și lp nu trebuie să depășească 4.
Toți octeții care nu pot fi codificați ca potriviri sunt codificați ca literali. Adică, literalii sunt pur și simplu octeți de 8 biți care sunt codificați unul câte unul.
Codificarea literală presupune că cei mai mari biți lc ai octetului anterior necomprimat se corelează cu octetul următor. De exemplu, în textul tipic englezesc, o literă mare este adesea urmată de o literă mică, iar o literă mică este urmată de obicei de o altă literă mică. În setul de caractere US-ASCII, cei mai mari trei biți sunt 010 pentru literele mari și 011 pentru literele mici. Când lc este cel puțin 3, codificarea literală poate profita de această proprietate în datele necomprimate.
Valoarea implicită (3) este de obicei bună. Dacă doriți o comprimare maximă, testați lc=4. Uneori ajută puțin, iar uneori înrăutățește comprimarea . Dacă o agravează, încercați de-asemeni cu lc=2.
Specifică numărul de biți de poziție literală. Minimul este 0 și maximul este 4; implicit este 0.
Lp afectează ce fel de aliniere în datele necomprimate este presupusă la codificarea literalelor. Consultați argumentul pb de mai jos pentru mai multe informații despre aliniere.
Specifică numărul de biți de poziție. Minimul este 0 și maximul este 4; implicit este 2.
Pb afectează ce fel de aliniere în datele necomprimate este presupusă în general. Valoarea implicită înseamnă alinierea pe patru octeți (2^pb=2^2=4), care este adesea o alegere bună atunci când nu există o ipoteză mai bună.
Când alinierea este cunoscută, definirea lui pb în mod corespunzător poate reduce puțin dimensiunea fișierului. De exemplu, cu fișierele text cu aliniere pe un octet (US-ASCII, ISO-8859-*, UTF-8), definirea pb=0 poate îmbunătăți ușor comprimarea. Pentru textul UTF-16, pb=1 este o alegere bună. Dacă alinierea este un număr impar, cum ar fi 3 octeți, pb=0 ar putea fi cea mai bună alegere.
Chiar dacă alinierea presupusă poate fi ajustată cu pb și lp, LZMA1 și LZMA2 încă favorizează ușor alinierea pe 16 octeți. Ar putea fi demn de luat în considerare atunci când proiectați formate de fișiere care pot fi adesea comprimate cu LZMA1 sau LZMA2.
Căutarea potrivirilor are un efect major asupra vitezei codificatorului, utilizării memoriei și raportului de comprimare. De obicei, găsitorii de potriviri din lanțul sumelor de control sunt mai rapizi decât găsitorii de potriviri din arborele binar. Valoarea implicită depinde de prestabilit: 0 folosește hc3, 1–3 folosește hc4, iar restul folosește bt4.
Sunt acceptate următoarele opțiuni de căutare de potriviri. Formulele de utilizare a memoriei de mai jos sunt aproximări estimative, care se apropie cel mai mult de realitate atunci când dict este o putere a lui doi.
Lanț de sumă de control, cu suma de control de 2 și 3 octeți
Valoarea minimă pentru nice: 3
Utilizarea memoriei:
dict * 7.5 (dacă dict <= 16 Mio);
dict * 5.5 + 64 MiB (dacă dict > 16 Mio)
Lanț de sumă de control, cu suma de control de 2, 3 și 4 octeți
Valoarea minimă pentru nice: 4
Utilizarea memoriei:
dict * 7.5 (dacă dict <= 32 Mio);
dict * 6.5 (dacă dict > 32 Mio)
Arbore binar cu suma de control de 2 octeți
Valoarea minimă pentru nice: 2
Utilizarea memoriei: dict * 9.5
Arbore binar cu suma de control de 2 și 3 octeți
Valoarea minimă pentru nice: 3
Utilizarea memoriei:
dict * 11.5 (dacă dict <= 16 Mio);
dict * 9.5 + 64 MiB (dacă dict > 16 Mio)
Arbore binar cu suma de control de 2, 3 și 4 octeți
Valoarea minimă pentru nice: 4
Utilizarea memoriei:
dict * 11.5 (dacă dict <= 32 Mio);
dict * 10.5 (dacă dict > 32 Mio)
Comprimarea mod specifică metoda de analiză a datelor produse de găsitorul de potriviri. Modurile acceptate sunt fast(rapid) și normal. Valoarea implicită este fast pentru prestabiliri 0–3 și normal pentru prestabiliri 4–9.
De obicei, fast este folosit cu instrumentele de căutare de potriviri ale lanțului de sume de control, și normal cu instrumentele de căutare de potriviri din arborele binar. Aceasta este și ceea ce fac prestabiririle.
Specifică ceea ce este considerat a fi o lungime bună(nice) pentru o potrivire. Odată ce este găsită o potrivire de cel puțin nice octeți, algoritmul nu mai caută după potriviri posibile mai bune.
Nice poate fi de 2–273 octeți. Valorile mai mari tind să ofere un raport de comprimare mai bun în detrimentul vitezei. Valoarea implicită depinde de prestabilit.
Specifică adâncimea maximă de căutare în găsitorul de potriviri. Valoarea implicită este valoarea specială de 0, ceea ce face ca instrumentul de comprimare să determine o adâncime rezonabilă pornind de la valorile mf și nice.
Adâncimea rezonabilă pentru lanțuri de sumă de control este 4–100 și 16–1000 pentru arbori binari. Folosirea unor valori foarte mari pentru adâncime poate face codificatorul extrem de lent cu unele fișiere. Evitați să stabiliți adâncimea la valori peste 1000, cu excepția cazului în care sunteți pregătit să întrerupeți comprimarea în cazul în care durează prea mult.
La decodificarea fluxurilor brute (--format=raw), LZMA2 are nevoie doar de dimensiunea dicționarului. LZMA1 are nevoie de asemenea de lc, lp și pb.
Adaugă un filtru de ramură/apel/salt (branch/call/jump ⟶ „BCJ”) la lanțul de filtre. Aceste filtre pot fi utilizate numai ca un filtru care nu este ultimul din lanțul de filtrare.
Un filtru BCJ convertește adresele relative din codul mașinii în omoloagele lor absolute. Acest lucru nu modifică dimensiunea datelor, dar crește redundanța, ceea ce poate ajuta LZMA2 să producă fișier .xz cu 0–15 % mai mic. Filtrele BCJ sunt întotdeauna reversibile, deci folosind un filtru BCJ pentru tipul greșit de date nu provoacă nicio pierdere de date, deși poate înrăutăți puțin raportul de comprimare. Filtrele BCJ sunt foarte rapide și folosesc o cantitate nesemnificativă de memorie.
Aceste filtre BCJ au probleme cunoscute legate de raportul de comprimare:
  • Unele tipuri de fișiere care conțin cod executabil (de exemplu, fișiere obiect, biblioteci statice și module de kernel Linux) au adresele din instrucțiuni completate cu valori de umplere. Aceste filtre BCJ vor face în continuare conversia adresei, ceea ce va înrăutăți comprimarea cu aceste fișiere.
  • Dacă pe o arhivă este aplicat un filtru BCJ, este posibil ca raportul de comprimare să fie mai rău decât la neutilizarea unui filtru BCJ. De exemplu, dacă există executabile similare sau chiar identice, filtrarea va face probabil fișierele mai puțin asemănătoare și astfel comprimarea este mai proastă. Conținutul fișierelor neexecutabile din aceeași arhivă poate conta și el. În practică, trebuie să încercați cu și fără filtru BCJ pentru a vedea care rezultat este mai bun în fiecare situație.
Seturi de instrucțiuni diferite au o aliniere diferită: fișierul executabil trebuie aliniat la un multiplu al acestei valori în datele de intrare pentru ca filtrul să funcționeze.

Filtru Aliniere Note
x86 1 x86 pe 32 de biți
sau 64 de biți
ARM 4
ARM-Thumb 2
ARM64 4 alinierea pe 4096-octeți
este cea mai bună
PowerPC 4 Doar big endian
IA-64 16 Itanium
SPARC 4
RISC-V 2
Deoarece datele filtrate prin BCJ sunt de obicei comprimate cu LZMA2, raportul de comprimare poate fi ușor îmbunătățit dacă opțiunile LZMA2 sunt definite pentru a se potrivi cu alinierea filtrului BCJ selectat. Exemple:
  • Filtrul IA-64 are o aliniere de 16 octeți, astfel încât pb=4,lp=4,lc=0 este alegere adecvată cu LZMA2 (2^4=16).
  • Codul RISC-V are o aliniere pe 2 sau 4 octeți, depinzând de faptul că fișierul conține instrucțiuni comprimate pe 16 biți (extensia C) sau nu. Atunci când se utilizează instrucțiuni pe 16 biți, pb=2,lp=1,lc=3 sau pb=1,lp=1,lc=3 este o alegere bună. Atunci când nu sunt prezente instrucțiuni pe 16 biți, pb=2,lp=2,lc=2 este cea mai bună alegere. readelf -h poate fi utilizată pentru a verifica dacă „RVC” apare în linia „Indicatori".
  • ARM64 este întotdeauna aliniat pe 4 octeți, astfel încât pb=2,lp=2,lc=2 este cea mai bună alegere.
  • Filtrul x86 este o excepție. De obicei, este bine să rămâneți la valorile implicite ale LZMA2 (pb=2,lp=0,lc=3) atunci când comprimați executabile x86.
Toate filtrele BCJ acceptă același opțiuni:
Specifică poziția de pornire care este utilizată la conversia între adresele relative și absolute. Poziția trebuie să fie un multiplu al alinierii filtrului (consultați tabelul de mai sus). Valoarea implicită este zero. În practică, valoarea implicită este bună; specificarea unei poziții personalizate nu este aproape niciodată utilă.
Adaugă filtrul Delta în lanțul de filtrare. Filtrul Delta poate fi folosit doar ca un filtru care nu este ultimul în lanțul de filtrare.
În prezent, este acceptat doar calculul delta simplu de octeți. Poate fi util la comprimarea, de exemplu, a imaginilor bitmap necomprimate sau a sunetului PCM necomprimat. Cu toate acestea, algoritmii cu scop special pot da rezultate semnificativ mai bune decât Delta + LZMA2. Acest lucru este valabil mai ales în cazul audio, care se comprimă mai repede și mai bine, de exemplu, cu flac(1).
Opțiuni acceptate:
Specifică distanța calculului delta în octeți. Distanța trebuie să fie 1–256. Valoarea implicită este 1.
De exemplu, cu dist=2 și intrare de opt octeți: A1 B1 A2 B3 A3 B5 A4 B7, ieșirea va fi: A1 B1 01 02 01 02 01 02.

Alte opțiuni

Suprimă avertismentele și notificările. Specificați acest lucru de două ori pentru a suprima și erorile. Această opțiune nu are niciun efect asupra stării de ieșire. Adică, chiar dacă o avertizare a fost suprimată, starea de ieșire pentru a indica o avertizare este încă utilizată.
Oferă informații detaliate. Dacă ieșirea de eroare standard este conectată la un terminal, xz va afișa un indicator de progres. Specificarea opțiunii --verbose de două ori, va avea ca rezultat oferirea de informații și mai detaliate.
Indicatorul de progres afișează următoarele informații:
  • Procentul de completare este afișat dacă se cunoaște dimensiunea fișierului de intrare. Adică, procentul nu poate fi afișat la procesarea fișierului prin conducte(pipe).
  • Cantitatea de date comprimate produse (comprimare) sau consumate (decomprimare).
  • Cantitatea de date necomprimate consumate (comprimare) sau produse (decomprimare).
  • Raportul de comprimare, care se calculează împărțind cantitatea de date comprimate procesate până acum la cantitatea de date necomprimate procesate până acum.
  • Viteza de comprimare sau decomprimare. Aceasta este măsurată drept cantitatea de date necomprimate consumate (comprimare) sau produse (decomprimare) pe secundă. Este afișată după ce au trecut câteva secunde de când xz a început procesarea fișierului.
  • Timpul scurs în format M:SS sau H:MM:SS.
  • Timpul rămas estimat este afișat numai atunci când dimensiunea fișierului de intrare este cunoscută și au trecut deja câteva secunde de când xz a început procesarea fișierului. Ora este afișată într-un format mai puțin precis, care nu are niciodată două puncte, de exemplu, 2 min 30 s.
Când ieșirea de eroare standard nu este un terminal, --verbose va face xz să imprime numele fișierului, dimensiunea comprimată, dimensiunea necomprimată, raportul de comprimare și, eventual, de asemenea, viteza și timpul scurs pe o singură linie la ieșirea de eroare standard după comprimarea sau decomprimarea fișierului. Viteza și timpul scurs sunt incluse numai atunci când operațiunea a durat cel puțin câteva secunde. Dacă operațiunea nu s-a încheiat, de exemplu, din cauza întreruperii din partea utilizatorului, se imprimă și procentul de completare dacă se cunoaște dimensiunea fișierului de intrare.
Nu comută starea de ieșire la 2 chiar dacă a fost detectată o condiție care merită avertizată. Această opțiune nu afectează nivelul de detaliere al informațiilor, astfel încât atât --quiet cât și --no-warn trebuie folosite pentru a nu afișa avertismente și pentru a nu modifica starea de ieșire.
Afișează mesajele într-un format care poate fi analizat de mașină. Acest lucru are scopul de a ușura scrierea interfețelor în care se dorește să se folosească xz în loc de liblzma, ceea ce poate fi cazul cu diferite scripturi. Ieșirea cu această opțiune activată este menită să fie stabilă în toate versiunile xz. Consultați secțiunea MOD ROBOT pentru detalii.
Afișează, într-un format care poate fi citit de om, câtă memorie fizică (RAM) și câte fire de execuție de procesor xz crede că are sistemul și limitele de utilizare a memoriei pentru comprimare și decomprimare și iese cu succes.
Afișează un mesaj de ajutor care descrie opțiunile cele mai frecvent utilizate și iese cu succes.
Afișează un mesaj de ajutor care descrie toate caracteristicile xz și iese cu succes
Afișează numărul versiunii xz și liblzma într-un format care poate fi citit de om. Pentru a obține rezultate analizabile de mașină, specificați --robot înainte de --version.

MOD ROBOT

Modul robot este activat cu opțiunea --robot. Face ieșirea lui xz mai ușor de analizat de către alte programe. În prezent, opțiunea --robot este acceptată numai împreună cu opțiunile --list, --filters-help, --info-memory, și --version. Va fi acceptată pentru comprimare și decomprimare în viitor.

Modul listă

xz --robot --list utilizează o ieșire separată de tabulatori. Prima coloană a fiecărei linii are un șir care indică tipul de informații găsite pe acea linie:

Aceasta este întotdeauna prima linie când începe să se listeze un fișier. A doua coloană de pe linie este numele fișierului.
Această linie conține informații generale despre fișierul .xz. Această linie este întotdeauna tipărită după linia name.
Acest tip de linie este utilizat numai atunci când a fost specificată opțiunea --verbose. Există tot atâtea linii stream câte fluxuri există în fișierul .xz.
Acest tip de linie este utilizat numai atunci când a fost specificată opțiunea --verbose. Există tot atâtea linii block câte blocuri există în fișierul .xz. Liniile block sunt afișate după toate liniile stream; tipurile diferite de linii nu sunt intercalate.
Acest tip de linie este folosit numai atunci când opțiunea --verbose a fost specificată de două ori. Această linie este afișată după toate liniile block. Ca și linia file, linia summary conține informații generale despre fișierul .xz.
Această linie este întotdeauna ultima linie din lista afișată la ieșire. Aceasta arată numărul total și dimensiunile.

Coloanele din liniile file:

2.
Numărul de fluxuri din fișier
3.
Numărul total de blocuri din fluxuri
4.
Dimensiunea comprimată a fișierului
5.
Dimensiunea necomprimată a fișierului
6.
Raportul de comprimare, de exemplu, 0,123. Dacă raportul este peste 9,999, în locul raportului sunt afișate trei liniuțe (---).
7.
Lista de nume de verificare a integrității, separate prin virgule. Următoarele șiruri sunt utilizate pentru tipurile de verificare cunoscute: None, CRC32, CRC64 și SHA-256. Pentru tipurile de verificări necunoscute, se utilizează None-N, unde N este ID-ul de verificare ca număr zecimal (una sau două cifre).
8.
Dimensiunea totală a umpluturii fluxului din fișier

Coloanele din liniile stream:

2.
Numărul fluxului (primul flux este 1)
3.
Numărul de blocuri din flux
4.
Poziția de pornire a comprimării
5.
Poziția de pornire a decomprimării
6.
Dimensiune comprimată (nu include umplutura fluxului)
7.
Dimensiune necomprimată
8.
Raport de comprimare
9.
Numele verificării de integritate
10.
Dimensiunea umpluturii fluxului

Coloanele din liniile block:

2.
Numărul fluxului care conține acest bloc
3.
Numărul blocului în raport cu începutul fluxului (primul bloc este 1)
4.
Numărul blocului în raport cu începutul fișierului
5.
Poziția de pornire a comprimării în raport cu începutul fișierului
6.
Poziția de pornire necomprimată în raport cu începutul fișierului
7.
Dimensiunea totală comprimată a blocului (include antetele)
8.
Dimensiune necomprimată
9.
Raport de comprimare
10.
Numele verificării de integritate

Dacă opțiunea --verbose a fost specificată de două ori, coloane suplimentare sunt incluse pe liniile block. Acestea nu sunt afișate cu o singură specificare a opțiunii --verbose, deoarece obținerea acestor informații necesită multe căutări și, prin urmare, poate fi lentă:

11.
Valoarea verificării integrității în hexazecimal
12.
Dimensiunea antetului blocului
13.
Indicatori de bloc: c indică faptul că este prezentă dimensiunea comprimată, iar u indică faptul că este prezentă dimensiunea necomprimată. Dacă indicatorul nu este determinat, este afișată o liniuță (-) pentru a menține lungimea șirului fixă. Pot fi adăugate noi indicatoare la sfârșitul șirului, în viitor.
14.
Dimensiunea datelor comprimate reale din bloc (acest lucru exclude antetul blocului, umplutura blocului și câmpurile de verificare)
15.
Cantitatea de memorie (în octeți) necesară pentru a decomprima acest bloc cu această versiune xz
16.
Lanț de filtrare. Rețineți că majoritatea opțiunilor utilizate în timpul comprimării nu pot fi cunoscute, deoarece doar opțiunile necesare pentru decomprimare sunt stocate în anteturile .xz.

Coloanele din liniile summary:

2.
Cantitatea de memorie (în octeți) necesară pentru a decomprima acest fișier cu această versiune xz
3.
yes sau no indicând dacă toate antetele blocurilor au atât dimensiunea comprimată, cât și dimensiunea necomprimată stocate în ele

Începând cu xz 5.1.2alpha:

4.
Versiunea xz minimă necesară pentru a decomprima fișierul

Coloanele din linia totals:

2.
Numărul de fluxuri
3.
Numărul de blocuri
4.
Dimensiunea comprimată
5.
Dimensiune necomprimată
6.
Raportul mediu de comprimare
7.
Lista de nume de verificare a integrității, separate prin virgule, care au fost prezente în fișiere
8.
Dimensiunea umpluturii fluxului
9.
Numărul de fișiere. Aceasta este aici pentru a păstra ordinea coloanelor anterioare la fel ca pe liniile file.

Dacă opțiunea --verbose a fost specificată de două ori, pe linia totals sunt incluse coloane suplimentare:

10.
Cantitatea maximă de memorie (în octeți) necesară pentru a decomprima fișierele cu această versiune xz
11.
yes sau no indicând dacă toate antetele blocurilor au atât dimensiunea comprimată, cât și dimensiunea necomprimată stocate în ele

Începând cu xz 5.1.2alpha:

12.
Versiunea xz minimă necesară pentru a decomprima fișierul

Versiunile viitoare pot adăuga noi tipuri de linii și pot fi adăugate coloane noi la tipurile de linii existente, dar coloanele existente nu vor fi modificate.

Ajutor pentru filtrare

xz --robot --filters-help afișează filtrele acceptate în următorul format:

filtru:opțiune=<valoare>,opțiune=<valoare>...

Numele filtrului
Numele unei opțiuni specifice unui filtru
Intervalele numerice valoare apar ca <min-max>. Alegerile valoare de tip șir de caractere sunt afișate în cadrul < > și separate de un caracter |.

Fiecare filtru este afișat pe propria linie.

Informații privind limita memoriei

xz --robot --info-memory afișează o singură linie cu multiple coloane separate prin tabulatoare:

1.
Cantitatea totală de memorie fizică (RAM) în octeți.
2.
Limita de utilizare a memoriei pentru comprimare în octeți (--memlimit-compress). O valoare specială de 0 indică configurarea implicită, care pentru modul cu un singur fir este la fel ca fără limită.
3.
Limita de utilizare a memoriei pentru decomprimare în octeți (--memlimit-decompress). O valoare specială de 0 indică configurarea implicită, care pentru modul cu un singur fir este la fel ca fără limită.
4.
Începând cu xz 5.3.4alpha: Utilizarea memoriei pentru decomprimarea cu mai multe fire în octeți (--memlimit-mt-decompress). Acesta nu este niciodată zero, deoarece o valoare implicită specifică sistemului afișată în coloana 5 este utilizată dacă nu a fost specificată în mod explicit nicio limită. De asemenea, aceasta nu este niciodată mai mare decât valoarea din coloana 3, chiar dacă a fost specificată o valoare mai mare cu --memlimit-mt-decompress.
5.
Începând cu xz 5.3.4alpha: o limită implicită de utilizare a memoriei specifică sistemului, care este utilizată pentru a limita numărul de fire de execuție atunci când se comprimă cu un număr automat de fire de execuție (--threads=0) și nicio limită de utilizare a memoriei nu fost specificată cu (--memlimit-compress). Aceasta este, de asemenea, utilizată ca valoare implicită pentru --memlimit-mt-decompress.
6.
Începând cu xz 5.3.4alpha: numărul de fire de execuție de procesor disponibile.

În viitor, rezultatul xz --robot --info-memory poate avea mai multe coloane, dar niciodată mai mult de o singură linie.

Versiunea

xz --robot --version va afișa numărul versiunii xz și liblzma în următorul format:

XZ_VERSION=XYYYZZZS
LIBLZMA_VERSION=XYYYZZZS

Versiunea majoră.
Versiunea minoră. Numerele pare sunt prezente în versiunile stabile. Numerele impare sunt prezente în versiunile alfa sau beta.
Nivelul de plasture(patch) pentru versiunile stabile sau doar un contor pentru versiunile de dezvoltare.
Stabilitate. 0 este alfa, 1 este beta și 2 este stabil. S trebuie să fie întotdeauna 2 atunci când AAA este par.

XYYYZZZS sunt aceleași pe ambele linii dacă xz și liblzma sunt din aceeași versiune XZ Utils.

Exemple: 4.999.9beta este 49990091 și 5.0.0 este 50000002.

STARE DE IEȘIRE

0
Totul este bine.
1
A apărut o eroare.
2
A apărut ceva care merită să fie avertizat, dar nu au apărut erori reale.

Notificările (nu avertismentele sau erorile) afișate la ieșirea de eroare standard nu afectează starea de ieșire.

VARIABILE DE MEDIU

xz analizează liste de opțiuni separate prin spații din variabilele de mediu XZ_DEFAULTS și XZ_OPT, în această ordine, înainte de a analiza opțiunile din linia de comandă. Rețineți că numai opțiunile sunt analizate din variabilele de mediu; toate non-opțiunile sunt ignorate în tăcere. Analiza se face cu funcția getopt_long(3) care este folosită și pentru argumentele liniei de comandă.

Opțiuni implicite specifice utilizatorului sau la nivelul întregului sistem. De obicei, acest lucru este specificat într-un script de inițializare shell pentru a activa limitatorul de utilizare a memoriei lui xz implicit. Excluzând scripturile de inițializare shell și cazurile speciale similare, scripturile nu trebuie niciodată să modifice sau să dezactiveze XZ_DEFAULTS.
Acest lucru este pentru transmiterea opțiunilor către xz atunci când nu este posibil să definiți opțiunile direct în linia de comandă a xz. Acesta este cazul când xz este rulat de un script sau de un instrument, de exemplu, GNU tar(1):

XZ_OPT=-2v tar caf foo.tar.xz foo
Scripturile pot folosi XZ_OPT, de exemplu, pentru a configura opțiunile implicite de comprimare specifice scriptului. Se recomandă totuși să se permită utilizatorilor să înlocuiască XZ_OPT dacă acest lucru este rezonabil. De exemplu, în scripturile sh(1) se poate folosi ceva de genul acesta:

XZ_OPT=${XZ_OPT-"-7e"}
export XZ_OPT

COMPATIBILITATE CU LZMA-UTILS

Sintaxa liniei de comandă a lui xz este practic o super-colecție de lzma, unlzma și lzcat așa cum se găsește în LZMA Utils 4.32.x. În cele mai multe cazuri, este posibil să înlocuiți LZMA Utils cu XZ Utils fără a întrerupe scripturile existente. Există totuși unele incompatibilități, care uneori pot cauza probleme.

Niveluri de comprimare prestabilite

Numerotarea nivelurilor de comprimare prestabilite nu este identică în xz și LZMA Utils. Cea mai importantă diferență este modul în care dimensiunile dicționarului sunt atribuite diferitelor niveluri prestabilite. Dimensiunea dicționarului este aproximativ egală cu memoria utilizată la decomprimare.

Nivel xz LZMA Utils
-0 256 KiB     N/A   
-1 1 MiB     64 KiB   
-2 2 MiB     1 MiB   
-3 4 MiB     512 KiB   
-4 4 MiB     1 MiB   
-5 8 MiB     2 MiB   
-6 8 MiB     4 MiB   
-7 16 MiB     8 MiB   
-8 32 MiB     16 MiB   
-9 64 MiB     32 MiB   

Diferențele de dimensiune a dicționarului afectează deasemenea cantitatea de memorie utilizată la comprimare dar există și alte diferențe între LZMA Utils și XZ Utils, care fac diferența și mai mare:

Nivel xz LZMA Utils 4.32.x
-0 3 MiB     N/A
-1 9 MiB     2 MiB
-2 17 MiB     12 MiB
-3 32 MiB     12 MiB
-4 48 MiB     16 MiB
-5 94 MiB     26 MiB
-6 94 MiB     45 MiB
-7 186 MiB     83 MiB
-8 370 MiB     159 MiB
-9 674 MiB     311 MiB

Nivelul prestabilit implicit în LZMA Utils este -7, în timp ce în XZ Utils este -6, deci ambele folosesc un dicționar de 8Mio în mod implicit.

Fișiere .lzma transmise în flux vs. netransmise în flux

Dimensiunea necomprimată a fișierului poate fi stocată în antetul .lzma. LZMA Utils face asta atunci când comprimă fișiere obișnuite. Alternativa este să marcați că dimensiunea necomprimată este necunoscută și să folosiți marcajul de sfârșit de încărcare pentru a indica unde ar trebui să se oprească decomprimarea. LZMA Utils folosește această metodă atunci când dimensiunea necomprimată nu este cunoscută, ceea ce este cazul, de exemplu, când se folosesc conducte.

xz acceptă decomprimarea fișierelor .lzma cu sau fără marcaj de sfârșit de încărcare, dar toate fișierele .lzma create de xz vor folosi marcajul de sfârșit de încărcare și vor avea dimensiunea necomprimată marcată ca necunoscută în antetul .lzma. Aceasta poate fi o problemă în unele situații mai puțin frecvente. De exemplu, un instrument de decomprimare .lzma încorporat într-un dispozitiv poate funcționa numai cu fișiere care au dimensiunea necomprimată cunoscută. Dacă întâmpinați această problemă, trebuie să utilizați LZMA Utils sau LZMA SDK pentru a crea fișiere .lzma cu dimensiunea necomprimată cunoscută.

Fișiere .lzma neacceptate

Formatul .lzma permite valori lc de până la 8 și valori lp de până la 4. LZMA Utils poate decomprima fișiere cu orice lc și lp, dar creează întotdeauna fișiere cu lc=3 și lp=0. Crearea de fișiere cu alte lc și lp este posibilă cu xz și cu LZMA SDK.

Implementarea filtrului LZMA1 în liblzma necesită ca suma lc și lp să nu depășească 4. Altfel, fișierele .lzma, care depășesc această limitare, nu pot fi decomprimate cu xz.

LZMA Utils creează numai fișiere .lzma care au o dimensiune de dicționar de 2^n (o putere de 2), dar acceptă fișiere cu orice dimensiune de dicționar. liblzma acceptă numai fișierele .lzma care au dimensiunea de dicționar de 2^n sau 2^n + 2^(n-1). Acest lucru este pentru a reduce numărul de „fals pozitiv” atunci când se detectează fișiere .lzma.

Aceste limitări nu ar trebui să fie o problemă în practică, deoarece practic toate fișierele .lzma au fost comprimate cu opțiuni pe care liblzma le va accepta.

Resturi rămase

Când decomprimă, LZMA Utils ignoră în tăcere totul după primul flux .lzma. În majoritatea situațiilor, aceasta este o eroare. Aceasta înseamnă, de asemenea, că LZMA Utils nu acceptă decomprimarea fișierelor .lzma concatenate.

Dacă au rămas date după primul flux .lzma, xz consideră că fișierul este corupt, cu excepția cazului în care a fost utilizată opțiunea --single-stream. Acest lucru poate rupe scripturile obscure(scrise deficitar) care presupun că resturile rămase sunt ignorate.

NOTE

Rezultatul comprimării poate varia

Ieșirea exactă comprimată produsă din același fișier de intrare necomprimat poate varia între versiunile XZ Utils, chiar dacă opțiunile de comprimare sunt identice. Acest lucru se datorează faptului că instrumentul codificator poate fi îmbunătățit (comprimare mai rapidă sau mai bună) fără a afecta formatul fișierului. Ieșirea poate varia chiar și între compilările diferite ale aceleiași versiuni XZ Utils, dacă sunt utilizate opțiuni diferite de compilare.

Cele de mai sus înseamnă că odată ce opțiunea --rsyncable a fost utilizată, fișierele rezultate nu vor fi neapărat sincronizate cu rsync decât dacă atât fișierele vechi, cât și cele noi au fost comprimate cu aceeași versiune xz. Această problemă poate fi remediată dacă o parte a implementării codificatorului este înghețată pentru a menține stabilă ieșirea „rsyncabilă” între versiunile xz.

Instrumente de decomprimare .xz încorporate

Implementările instrumentului de decomprimare .xz încorporat, cum ar fi XZ Embedded, nu acceptă neapărat fișiere create cu tipuri de verificare a integrității, altele decât none și crc32. Deoarece valoarea implicită este --check=crc64, trebuie să utilizați --check=none sau --check=crc32 atunci când creați fișiere pentru sistemele încorporate.

În afara sistemelor încorporate, toate instrumentele de decomprimare în format .xz acceptă toate tipurile de verificare sau cel puțin pot decomprima fișierul fără a efectua verificarea integrității dacă acel tip de verificare nu este acceptat.

XZ Embedded acceptă filtre BCJ, dar numai cu poziție de pornire implicită.

EXEMPLE

Bazice

Comprimă fișierul foo în foo.xz folosind nivelul de comprimare implicit (-6) și elimină fișierul foo dacă comprimarea are succes:

xz foo

Decomprimă bar.xz în bar și nu elimină bar.xz chiar dacă decomprimarea este efectuată cu succes:

xz -dk bar.xz

Creează baz.tar.xz cu nivelul prestabilit -4e (-4 --extreme), care este mai lent decât nivelul prestabilit implicit -6, dar necesită mai puțină memorie pentru comprimare și decomprimare (48Mio și, respectiv, 5Mio):

tar cf - baz | xz -4e > baz.tar.xz

Un amestec de fișiere comprimate și necomprimate poate fi decomprimat la ieșirea standard cu o singură comandă:

xz -dcf a.txt b.txt.xz c.txt d.txt.lzma > abcd.txt

Comprimarea în paralel a mai multor fișiere

În sisteme GNU și *BSD, find(1) și xargs(1) pot fi utilizate pentru a paraleliza comprimarea mai multor fișiere:

find . -type f \! -name '*.xz' -print0 \

| xargs -0r -P4 -n16 xz -T1

Opțiunea -P pentru comanda xargs(1) stabilește numărul de procese paralele xz. Cea mai bună valoare pentru opțiunea -n depinde de câte fișiere trebuie să fie comprimate. Dacă există doar câteva fișiere, valoarea ar trebui probabil să fie 1; cu zeci de mii de fișiere, 100 sau chiar mai mult poate să fie valoarea potrivită pentru a reduce numărul de procese xz pe care xargs(1) le va crea în final.

Opțiunea -T1 pentru xz este acolo pentru a-l forța să ruleze în modul cu un singur fir de execuție, deoarece xargs(1) este folosit pentru a controla cantitatea de paralelizare.

Modul robot

Calculează câți octeți au fost salvați în total după comprimarea mai multor fișiere:

xz --robot --list *.xz | awk '/^totals/{print $5-$4}'

Un script poate dori să afle dacă folosește o versiune xz suficient de nouă. Următorul script sh(1) verifică dacă numărul versiunii instrumentului xz este cel puțin 5.0.0. Această metodă este compatibilă cu versiunile beta vechi, care nu acceptau opțiunea --robot:

if ! eval "$(xz --robot --version 2> /dev/null)" ||

[ "$XZ_VERSION" -lt 50000002 ]; then
echo "Your xz is too old." fi unset XZ_VERSION LIBLZMA_VERSION

Stabilește o limită de utilizare a memoriei pentru decomprimare folosind variabila de mediu XZ_OPT, dar dacă o limită a fost deja stabilită, nu o mărește:

NEWLIM=$((123 << 20))  # 123 MiB
OLDLIM=$(xz --robot --info-memory | cut -f3)
if [ $OLDLIM -eq 0 -o $OLDLIM -gt $NEWLIM ]; then

XZ_OPT="$XZ_OPT --memlimit-decompress=$NEWLIM"
export XZ_OPT fi

Lanțuri de filtrare personalizate pentru instrumentul de comprimare

Cea mai simplă utilizare a lanțurilor de filtrare personalizate este personalizarea unei opțiuni prestabilite LZMA2. Acest lucru poate fi util, deoarece opțiunile prestabilite acoperă doar un subset al combinațiilor potențial utile de opțiuni de comprimare.

Coloanele CPUComp din tabelele de descriere a opțiunilor -0 ... -9 și --extreme sunt utile atunci când personalizați opțiunilor prestabilite LZMA2. Iată părțile relevante colectate din aceste două tabele:

ValPrestab CPUComp
-0 0
-1 1
-2 2
-3 3
-4 4
-5 5
-6 6
-5e 7
-6e 8

Dacă știți că un fișier necesită un dicționar oarecum mare (de exemplu, 32Mio) pentru a se comprima bine, dar doriți să-l comprimați mai repede decât ar face xz -8, o opțiune prestabilită cu o valoare CPUComp scăzută (de exemplu, 1) poate fi modificată pentru a utiliza un dicționar mai mare:

xz --lzma2=preset=1,dict=32MiB foo.tar

Cu anumite fișiere, comanda de mai sus poate fi mai rapidă decât xz -6 în timp ce comprimă semnificativ mai bine. Cu toate acestea, trebuie subliniat că doar unele fișiere se beneficiază de un dicționar mare, păstrând în același timp valoarea CPUComp scăzută. Cea mai evidentă situație, în care un dicționar mare poate ajuta foarte mult, este o arhivă care conține fișiere foarte asemănătoare de cel puțin câțiva megaocteți fiecare. Dimensiunea dicționarului trebuie să fie semnificativ mai mare decât orice fișier individual pentru a permite LZMA2 să profite din plin de asemănările dintre fișierele consecutive.

Dacă utilizarea unei mari cantități de memorie pentru comprimare și decomprimare este în regulă, iar fișierul comprimat are cel puțin câteva sute de megaocteți, poate fi util să folosiți un dicționar și mai mare decât cei 64Mio pe care i-ar folosi xz -9:

xz -vv --lzma2=dict=192MiB big_foo.tar

Utilizarea opțiunii -vv (--verbose --verbose) ca în exemplul de mai sus, poate fi utilă pentru a vedea cerințele de memorie la comprimare și decomprimare. Amintiți-vă că utilizarea unui dicționar mai mare decât dimensiunea fișierului necomprimat este risipă de memorie, de aceea, comanda de mai sus nu este utilă pentru fișiere mici.

Uneori, timpul de comprimare nu contează, dar utilizarea memoriei la decomprimare trebuie menținută la un nivel scăzut, de exemplu, pentru a face posibilă decomprimarea fișierului pe un sistem încorporat. Următoarea comandă folosește -6e (-6 --extreme) ca bază și fixează dimensiunea dicționarului la doar 64Kio. Fișierul rezultat poate fi decomprimat cu XZ Embedded (de aceea există --check=crc32) folosind aproximativ 100Kio de memorie.

xz --check=crc32 --lzma2=preset=6e,dict=64KiB foo

Dacă doriți să stoarceți cât mai mulți octeți posibil, ajustarea numărului de biți de context literal (lc) și a numărului de biți de poziție (pb) poate ajuta uneori. Ajustarea numărului de biți de poziție literală (lp) ar putea ajuta, de asemenea, dar de obicei lc și pb sunt mai importante. De exemplu, o arhivă de cod sursă conține în mare parte text US-ASCII, așa că ceva precum comanda următoare, ar putea oferi un fișier „mai slăbuț” (aproximativ cu 0,1%) mai mic decât cu xz -6e (încercați și fără lc=4):

xz --lzma2=preset=6e,pb=0,lc=4 source_code.tar

Utilizarea unui alt filtru împreună cu LZMA2 poate îmbunătăți comprimarea cu anumite tipuri de fișiere. De exemplu, pentru a comprima o bibliotecă partajată x86 pe 32 de biți sau x86 pe 64 de biți folosind filtrul BCJ x86:

xz --x86 --lzma2 libfoo.so

Rețineți că ordinea opțiunilor de filtrare este semnificativă. Dacă --x86 este specificată după --lzma2, xz va da o eroare, deoarece nu poate exista niciun filtru după LZMA2 și, de asemenea, pentru că filtrul x86 BCJ nu poate fi utilizat ca ultimul filtru din lanțul de filtrare.

Filtrul Delta împreună cu LZMA2 pot da rezultate bune cu imagini bitmap. De obicei, ar trebui să întreacă comprimarea PNG, care are câteva filtre mai avansate decât delta simplă, dar utilizează Deflate pentru comprimarea reală.

Imaginea trebuie să fie salvată în format necomprimat, de exemplu, ca TIFF necomprimat. Parametrul de distanță al filtrului Delta este fixat să se potrivească cu numărul de octeți per pixel din imagine. De exemplu, bitmap-ul RGB pe 24 de biți necesită dist=3 și este, de asemenea, bine să pasați pb=0 la LZMA2 pentru a se adapta alinierii pe trei octeți:

xz --delta=dist=3 --lzma2=pb=0 foo.tiff

Dacă mai multe imagini au fost introduse într-o singură arhivă (de exemplu, .tar), filtrul Delta va funcționa și pe aceasta atâta timp cât toate imaginile au același număr de octeți per pixel.

CONSULTAȚI ȘI

xzdec(1), xzdiff(1), xzgrep(1), xzless(1), xzmore(1), gzip(1), bzip2(1), 7z(1)

XZ Utils: <https://tukaani.org/xz/>
XZ Embedded: <https://tukaani.org/xz/embedded.html>
LZMA SDK: <https://7-zip.org/sdk.html>

2024-04-08 Tukaani