Sgonfia il flusso di compressione in cui è possibile inserire dati precompressi. Esiste una libreria .NET?

StackOverflow https://stackoverflow.com/questions/1410533

  •  05-07-2019
  •  | 
  •  

Domanda

Sto implementando la compressione Deflate e GZip per i contenuti web. .NET Framework DeflateStream funziona molto bene (non si comprime bene come SharpZipLib, ma è molto più veloce). Purtroppo (e tutte le altre librerie che conosco) manca una funzione per scrivere dati precompressi come stream.WritePrecompressed (byte [] buffer).

Con questa funzione sarebbe possibile inserire blocchi precompressi nel flusso. Ciò potrebbe ridurre il carico della cpu per comprimere questa parte e aumentare il throughput totale del server Web.

C'è qualche lib gestita in grado di farlo? O c'è qualche buon punto di partenza oltre ZLIB.NET da ComponentAce per fare questo?

È stato utile?

Soluzione

Un altro approccio è svuotare il flusso deflater (e possibilmente anche chiuderlo), per garantire che tutti i dati compressi bufferizzati vengano scritti nel flusso di output, quindi scrivere semplicemente i dati precompressi nel flusso di output sottostante, quindi riaprire di nuovo il flusso deflattore sopra il flusso di output.

Altri suggerimenti

IIRC, #ZipLib ti consente di impostare il livello di compressione, hai provato a svuotare il flusso, a zero il livello e quindi a inviare i dati già compressi prima di aumentare di nuovo il livello di compressione?

Se stai solo guardando questo per motivi di prestazioni, questa potrebbe essere una soluzione accettabile.

Sì, è possibile inserire blocchi precompressi in un flusso zlib. Inizia con l'esempio zpipe.c nell'origine zlib. Solo dove si desidera inserire il blocco precompresso, sostituire Z_NO_FLUSH con Z_FULL_FLUSH (altrimenti non utilizzare Z_FULL_FLUSH perché il rapporto di compressione ne risentirà.)

Ora l'uscita compressa è allineata in byte e l'ultimo blocco di sgonfiaggio è chiuso. Full flush significa che il blocco successivo oltre il blocco precompresso non può contenere riferimenti a ritroso.

Aggiungi il tuo blocco precompresso al flusso di output (ad es. memcpy). Avanzare strm.next_out al successivo byte vuoto. Continua con sgonfia da dove eri rimasto.

flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;
ret = deflate(&strm, flush);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top