Ştiri:

Vă rugăm să citiţi Regulamentul de utilizare a forumului Scientia în secţiunea intitulată "Regulamentul de utilizare a forumului. CITEŞTE-L!".

Main Menu

Observatii la articolul "cum functioneaza compresia fisierelor"

Creat de b12mihai, Aprilie 28, 2011, 09:14:32 PM

« precedentul - următorul »

0 Membri şi 1 Vizitator vizualizează acest subiect.

b12mihai

Am dat peste acest articol din Scientia.ro : http://www.scientia.ro/tehnologie/34-cum-functioneaza-calculatorul/413-cum-functioneaza-compresia-fisierelor-audio-video-foto.html#5 si m-a surprins faptul ca, desi se spune foarte corect despre existenta unor algoritmi probabilistici pe care se bazeaza compresia fisierelor, nu se pomeneste nimic despre algoritmul de codificare Huffman (desi exista acolo un link: http://www.data-compression.com/lossless.html - in care e primul lucru aparut, deci probabil ca autorul articolului stia de acesta), pe care se bazeaza arhivatoare ca gz, bzip2, jpeg encoding, etc. Cateva referinte despre acest algoritm, pe care eu le gasesc utile, aveti mai jos:

http://en.wikipedia.org/wiki/Huffman_coding
http://michael.dipperstein.com/huffman/

E bine doar sa precizati undeva in articol, daca puteti, pentru ca e un algoritm important.
Fiecare are scopul lui in lumea asta nebuna.

Scientia

Da, nu era nimic despre Huffman. Am introdus acum o scurtă referinţă.
Articolul este o încercare de a face inteligibil conceptul de compresie a fişierelor (sau arhivare, cum se foloseşte, în mod greşit, cred). Despre metodele de compresie am scris numai superficial, amintind câteva. Nu le-am dezvoltat, pentru că nu era locul. În orice caz, completarea e bine-venită.

::Marian

AlexandruLazar

Termenul de "arhivare" este în principiu folosit greșit ce-i drept. Originea vine din faptul că, în vremurile bune și frumoase când toată lumea știa ce este tar și la ce folosește, datorită "micilor" limitări ale gzip-ului de atunci (între care și faptul că nu putea comprima decât un singur fișier  ;D)  toate fișierele erau întâi arhivate (cu tar, care le aducea frumos pe toate într-o arhivă) iar arhiva era comprimată. Desigur că nu era obligatoriu să comprimi o arhivă dar în principiu nu te ajuta la nimic dacă fișierele erau doar arhivate, așa că termenii au ajuns să se cam încalece.

tavy

Citat din: AlexandruLazar din Aprilie 29, 2011, 12:31:59 AM
Originea vine din faptul că, în vremurile bune și frumoase când toată lumea știa ce este tar și la ce folosește, datorită "micilor" limitări ale gzip-ului de atunci (între care și faptul că nu putea comprima decât un singur fișier  ;D)  toate fișierele erau întâi arhivate (cu tar, care le aducea frumos pe toate într-o arhivă) iar arhiva era comprimată.
Și acum nu mai sunt acele ,,limitări". Poți să-mi spui și mie care este sintaxa pentru a putea folosi gzip și pentru arhivare?
Pentru că la mine în ,,man gzip" zice:
CitatIf  you  wish  to create a single archive file with multiple members so that members can later be extracted independently, use an archiver such as tar or zip.
Și nu am un ,,gzip" prea vechi: ,,Version: 1.4", ,,Build Date: Thu 21 Jan 2010 17:55:49 EET". Și din ce văd la ,,ftp.gnu.org/gnu/gzip/" se pare că e ultima versiune disponibilă.

Și cum ,,nu putea comprima decât un fișier"? Ce se întâmpla cu ,,gzip" după ce comprima fișierul? Era șters sau corupt automat astfel încât să nu mai poată comprima alt fișier?


Citat din: AlexandruLazar din Aprilie 29, 2011, 12:31:59 AM
Desigur că nu era obligatoriu să comprimi o arhivă dar în principiu nu te ajuta la nimic dacă fișierele erau doar arhivate, așa că termenii au ajuns să se cam încalece.
Parcă nu e chiar așa. Nu am mai folosit de mult benzi magnetice ca medii de stocare dar din ce îmi aduc aminte arhivarea ajuta mult.
Și ar mai fi o situație când am folosit ,,tar" fără să fac compresie. Am făcut transfer de date între două calculatoare astfel:
Pe calculatorul destinație: nc -l -p port | tar -x
Pe calculatorul sursă: tar -c nume_director | nc ip_destinatie port
Dacă viteza între calculatoare este suficient de mare, eu aveam gigabit, și volumul de date suficient de mare, compresia te poate încetini destul de mult.

AlexandruLazar

Nu nu, eu mă gândeam la lucruri mult mai vechi și numai în ceea ce privește transferul prin rețea -- nu mă gândeam la arhivarea pe bandă magnetică (de unde dealtfel și tar își trage numele  ;D tape-archiver).

CitatȘi cum ,,nu putea comprima decât un fișier"? Ce se întâmpla cu ,,gzip" după ce comprima fișierul? Era șters sau corupt automat astfel încât să nu mai poată comprima alt fișier?

Gzip comprimă stream-uri de date, fără să aibă noțiunea de fișier. Există formate de compresie care pot ține seama de împărțirea datelor în fișiere, astfel încât pot să realizeze simultan și o arhivare, însă o arhivă gzip nu poate să conțină (într-un mod și portabil și comod) mai multe fișiere. La asta mă refer spunând că nu poate comprima decât un fișier.

CitatȘi acum nu mai sunt acele ,,limitări". Poți să-mi spui și mie care este sintaxa pentru a putea folosi gzip și pentru arhivare?

Nu neapărat, sau mai bine zis sunt tot acolo în majoritatea programelor de compresie/decompresie în format gzip, dar se pot ocoli într-un mod standard. RFC1952 include posibilitatea ca formatul gzip să includă mai multe secțiuni ("membri" pe limba RFC1952), posibilitate care nu exista în primele versiuni (cea pe care o folosim acum și pe care e bazat RFC-ul e derivata din implementarea originală a lui Jean-Loup Gailly). Din păcate nu e foarte util pentru că (de la RFC citire):

Citat2.2. File format

     A gzip file consists of a series of "members" (compressed data
     sets).  The format of each member is specified in the following
     section.  The members simply appear one after another in the file,
     with no additional information before, between, or after them.

astfel încât dacă vrei să scoți și pe partea cealaltă fișiere, trebuie să te ocupi în software de reîmpărțirea pe fișiere a secțiunilor. GNU gzip nu știe să facă asta; acum vreo doi-trei ani știu că erau ceva discuții despre posibilitatea de a introduce asta în FreeBSD dar au rămas doar la nivel de discuții. În schimb poți face asta folosind zlib, și e o tehnică pe care am văzut-o folosită de câteva ori în special prin aplicații web.