Com'è possibile che un programma di compressione di file possa utilizzare più RAM rispetto al file non compresso che sta comprimendo?


3

Stavo comprimendo un set di file da 120 MB sulla migliore compressione offerta da 7z e ho notato che consumava quasi 600MB di RAM al massimo.

Perché questi programmi di compressione utilizzano così tanta RAM anche quando si lavora con insiemi di dati di dimensioni ridotte, fino al punto di consumare più volte più memoria rispetto alle dimensioni non compresse del proprio set di dati?

Solo curioso, sono più interessato al lato tecnico di esso.

Risposte:


6

Non sono mai stato in compressione tecnicamente, ma iniziamo a cercare ...

Il file di aiuto 7z menziona:

LZMA è un algoritmo basato su   Algoritmo di Lempel-Ziv. Fornisce molto   decompressione rapida (circa 10-20 volte   più veloce della compressione). Memoria   requisiti per compressione e   la decompressione è anche diversa (vedi   d = {Dimensione} [b | k | m] passa per dettagli).

(Si noti che l'articolo dell'algoritmo L-Z su wikipedia fa non menzionare qualsiasi cosa sui requisiti di memoria.)

d = {Size} [b | k | m] Sets Dimensione del dizionario   per LZMA . Devi specificare la taglia in   byte, kilobyte o megabyte. Il   il valore massimo per la dimensione del dizionario è 1   GB = 2 ^ 30 byte. Valori predefiniti per   LZMA ha 24 (16 MB) in modalità normale, 25   (32 MB) in modalità massima (-mx = 7) e 26   (64 MB) in modalità ultra (-mx = 9). Se tu   non specificare alcun simbolo dal set   [b | k | m], la dimensione del dizionario sarà   calcolato come DictionarySize = 2 ^ Size   byte. Per decomprimere un file   compresso dal metodo LZMA con   dimensione del dizionario N, hai bisogno di N   byte di memoria (RAM) disponibili.

Seguendo wikipedia ulteriormente l'articolo su codificatori di dizionari sembrerebbe che l'algoritmo funzioni confrontando i dati da comprimere con un insieme di dati in un "dizionario" che deve essere basato sui dati grezzi che devono essere compressi.

Indipendentemente da come viene costruito questo dizionario, poiché deve essere tenuto in memoria, il requisito di RAM è una funzione di questo dizionario. E poiché questo dizionario non è un dato grezzo, ma una struttura di dati non compressi, sarà (possibile) più grande dei dati non elaborati che vengono elaborati. Ha senso?


Leggilo, ti può dare alcuni indizi: en.wikipedia.org/wiki/LZ77_and_LZ78
LawrenceC

0

Se l'altra risposta è troppo impegnativa per qualcuno da leggere perché ha un sacco di gergo tecnico, offro la mia risposta.

Un file è memorizzato nel disco rigido o nel disco fisso. Cos'è un file che chiedi? Rispondo, un gruppo di 1 e 0 disposti in un ordine particolare che sembra un file dall'esterno. Cos'è un programma eseguibile *.exe? È eseguibile con codice macchina, anche un gruppo di 1 e 0. È anche memorizzato nel tuo disco. Quando si fa clic sull'eseguibile della compressione del file, l'algoritmo delle istruzioni del codice viene caricato da *.exe nell'unità disco nella RAM. Solo allora è in grado di funzionare. La CPU del computer esegue programmi e legge / scrive dati. Non può ottenere nulla direttamente dal disk drive. Deve prima caricare tutto nella memoria RAM, che funge da intermediario tra la CPU e l'unità disco in cui sono memorizzati tutti i dati.

Ora il programma di compressione file viene eseguito dalla CPU nella RAM. Che cosa dicono le istruzioni del codice alla CPU? Dicono di caricare il file vero e proprio dall'unità disco nella memoria RAM in modo che il programma possa funzionare con esso. Quindi ora abbiamo due cose nella memoria RAM: il programma stesso e il file.

Dì a questo programma di compressione file per comprimere il file. Tuttavia non può magicamente farlo. Per essere compresso, un file deve essere organizzato in un certo ordine, il più strettamente possibile. Forse prima della compressione, il file era in qualche modo disorganizzato, come il tuo file cabinet. Il programma di compressione dei file deve organizzare il file nel modo più ordinato e stretto possibile. Per fare questo deve temporaneamente mettere il file in uno stato ancora più disorganizzato per trovare tutti i pezzi in cui tutto ciò che appartiene.

Pensa a come comprimere i documenti. Per prima cosa li spargerai sulla tua scrivania per poterli vedere tutti, e li ordinano per categorie, e inizi a mettere i fogli in cartelle.

Quindi ora abbiamo tre cose nella memoria RAM: 1. Le istruzioni del programma stesso. 2. Il file originale che è stato caricato dall'unità disco. 3. Una copia temporanea del file originale, che è in stato di smembramento e rimessa insieme. Forse più copie temporanee dell'intero file o anche parti di esso sono fatte nella RAM per rendere più facile per il programma organizzare e comprimere questo file. Vedete ora in che modo i programmi di compressione dei file possono assorbire molta più RAM quando lavorano rispetto rispetto alle dimensioni del file originale nell'unità disco?

La quantità di RAM utilizzata durante questo processo dipende dall'abilità del programmatore che ha progettato l'applicazione. Esistono modi intelligenti ed efficienti per scrivere il codice in modo da ridurre al minimo il consumo di RAM. E poi ci sono modi di forza bruta per ottenere lo stesso compito, ma funziona più lentamente e occupa più RAM. La RAM può persino essere sprecata se il programma ha una perdita di memoria. Pensa a una perdita di memoria come fare più copie degli stessi dati, ma poi lasciarli sulla scrivania e non preoccuparti nemmeno di ripulirti.

Eventualmente tutte le copie temporanee verrebbero condensate nella versione compressa del file. È ancora nella memoria RAM, quindi la versione compressa del file deve essere inviata fino al disco del disco rigido in cui è stata salvata in modo permanente.

L'idea principale è che per raggiungere uno stato di bassa entropia si dovrebbe passare temporaneamente ad uno stato di alta entropia. Questo è ovviamente scritto nei termini più generali.

Picture of the RAM inside

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.