Uso dell'API di compressione

Molte applicazioni devono usare la compressione e la decompressione dei dati senza perdita. L'API di compressione semplifica questa operazione esponendo gli algoritmi di compressione di Windows tramite un'API pubblica. Ogni algoritmo di compressione ha un set di proprietà che ne controlla il comportamento. L'API Di compressione espone un'interfaccia che consente allo sviluppatore di impostare o eseguire query sui valori di queste proprietà. Tutte le proprietà per gli algoritmi di compressione supportati hanno valori predefiniti che rappresentano i valori di uso comune di queste proprietà. Se è necessaria una proprietà sia per la compressione che per la decompressione, i valori predefiniti saranno identici, assicurando che vengano usati valori identici per la compressione e la decompressione.

Selezione dell'algoritmo di compressione

Dopo che uno sviluppatore decide che un'applicazione deve comprimere o decomprimere i dati, il passaggio successivo consiste nel scegliere un algoritmo di compressione. Ciò può dipendere dai test per trovare la combinazione di velocità, rapporto di compressione e requisiti di memoria ottimali per una determinata applicazione. L'elenco seguente fornisce un confronto relativo degli algoritmi di compressione attualmente supportati dall'API di compressione. Non tutte le opzioni sono disponibili per ogni algoritmo di compressione e il confronto è approssimativo perché le prestazioni possono dipendere dai dati di input.

XPRESS (COMPRESS_ALGORITHM_XPRESS)

  • Molto veloce con requisiti di risorse bassi
  • Rapporto di compressione medio
  • Velocità elevate di compressione e decompressione
  • Requisito di memoria insufficiente
  • Supporta l'opzione COMPRESS_INFORMATION_CLASS_LEVEL disponibile nell'enumerazione COMPRESS_INFORMATION_CLASS. Il valore predefinito è (DWORD)0. Per alcuni dati, il valore (DWORD)1 può migliorare il rapporto di compressione con una velocità di compressione leggermente più lenta.

XPRESS con codifica Huffman (COMPRESS_ALGORITHM_XPRESS_HUFF)

  • Il rapporto di compressione è superiore a COMPRESS_ALGORITHM_XPRESS
  • Rapporto di compressione medio
  • Velocità di compressione e decompressione da media a elevata
  • Requisito di memoria insufficiente
  • Supporta l'opzione COMPRESS_INFORMATION_CLASS_LEVEL nell'enumerazione COMPRESS_INFORMATION_CLASS . Il valore predefinito è (DWORD)0. Per alcuni dati, il valore (DWORD)1 può migliorare il rapporto di compressione con una velocità di compressione leggermente più lenta.

MSZIP (COMPRESS_ALGORITHM_MSZIP)

  • Usa più risorse di COMPRESS_ALGORITHM_XPRESS_HUFF
  • Genera un blocco compresso simile a RFC 1951.
  • Rapporto di compressione medio-alto
  • Velocità di compressione media e velocità di decompressione elevata
  • Requisito di memoria media

LZMS (COMPRESS_ALGORITHM_LZMS)

  • Buon algoritmo se le dimensioni dei dati da comprimere sono superiori a 2 MB.
  • Rapporto di compressione elevato
  • Bassa velocità di compressione e velocità di decompressione elevata
  • Requisito di memoria da medio a elevato
  • Supporta l'opzione COMPRESS_INFORMATION_CLASS_BLOCK_SIZE nell'enumerazione COMPRESS_INFORMATION_CLASS. Una dimensione minima di 1 MB è consigliata per ottenere un rapporto di compressione migliore.

Scelta della modalità API di compressione da usare

Dopo che uno sviluppatore seleziona l'algoritmo di compressione, la decisione successiva è quale delle due modalità dell'API di compressione da usare: modalità buffer o modalità blocco. La modalità buffer è stata sviluppata per semplificare l'uso ed è consigliata per la maggior parte dei casi.

La modalità buffer suddivide automaticamente il buffer di input in blocchi di dimensioni appropriate per l'algoritmo di compressione selezionato. La modalità buffer formatta automaticamente e archivia le dimensioni del buffer non compresso nel buffer compresso. Le dimensioni del buffer compresso non vengono salvate automaticamente e l'applicazione deve salvarla per la decompressione. Non includere il flag COMPRESS_RAW nel parametro Algorithm quando si chiama CreateCompressor e CreateDecompressor per usare la modalità buffer. Per un esempio di codice di un'applicazione in modalità buffer, vedere la sezione Uso dell'API di compressione in modalità buffer.

La modalità blocco consente allo sviluppatore di controllare le dimensioni del blocco, ma richiede più lavoro da parte dell'applicazione. Quando si usa la modalità di blocco, l'applicazione deve suddividere i dati di input in parti di dimensioni appropriate durante la compressione e quindi rimettere insieme le parti durante la decompressione. La modalità di blocco ha esito negativo se le dimensioni del buffer di input sono maggiori delle dimensioni interne del blocco dell'algoritmo di compressione. La dimensione interna del blocco è di 32 KB per MSZIP e 1 GB per gli algoritmi di compressione XPRESS. La dimensione interna del blocco per LZMS è configurabile fino a 64 GB con un aumento corrispondente dell'uso della memoria. Le dimensioni del buffer compresso non vengono salvate automaticamente e l'applicazione deve anche salvarla per la decompressione. Il valore del parametro UncompressedBufferSize di Decompress deve essere esattamente uguale alla dimensione originale dei dati non compressi e non solo alle dimensioni del buffer di output. Ciò significa che l'applicazione deve salvare le dimensioni originali esatte dei dati non compressi, nonché i dati compressi e le dimensioni compresse, quando si usa la modalità di blocco. Includere il flag COMPRESS_RAW nel parametro Algorithm quando si chiamano sia CreateCompressor che CreateDecompressor per usare la modalità di blocco. Per un esempio di codice di un'applicazione in modalità blocco, vedere la sezione Uso dell'API di compressione in modalità blocco.

Allocazione di memoria personalizzata

Le applicazioni in modalità buffer e blocco hanno la possibilità di specificare una routine di allocazione di memoria personalizzata quando chiamano CreateCompressor e CreateDecompressor. Il parametro AllocationRoutines specifica la struttura COMPRESS_ALLOCATION_ROUTINES che contiene la routine di allocazione della memoria. L'applicazione può quindi impostare le dimensioni del blocco per il compressore usando SetCompressorInformation. Per un esempio di una semplice routine di allocazione personalizzata, vedere la sezione Uso dell'API di compressione in modalità blocco.