Deflate compressão riacho onde pré comprimido Os dados podem ser inseridos. Faz um exist .NET lib?

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

  •  05-07-2019
  •  | 
  •  

Pergunta

Estou implementando Deflate e GZip compactação de conteúdo web. Os executa .NET Framework DeflateStream muito bem (não comprimir que bom quanto SharpZipLib, mas é muito mais rápido). Infelizmente (e todos os outros libs eu sei) perca uma função para gravar dados pré-comprimida como stream.WritePrecompressed (byte [] buffer).

Com esta função seria possível inserir blocos pré-comprimida no fluxo. Isso poderia reduzir a carga da CPU para comprimir esta parte e aumentar o rendimento total do servidor web.

Existe alguma conseguiu lib capaz de fazer isso? Ou há qualquer bom ponto de partida para além ZLIB.NET de ComponentAce fazer isso?

Foi útil?

Solução

Outra abordagem é para liberar o fluxo deflater (e possivelmente também perto dele), a garantia de que todos os dados compactados em buffer é escrito para o fluxo de saída, e em seguida, basta escrever os seus dados pré-comprimida para o fluxo de saída subjacente, em seguida, voltar a abrir o fluxo deflater em cima do seu fluxo de saída novamente.

Outras dicas

IIRC o #ZipLib permite definir o nível de compressão, você já tentou liberar o fluxo e soltando o nível a 0 e, em seguida, enviar os dados já comprimidos antes de elevar o nível de compressão de novo?

Se você está apenas olhando para fazer isso por razões de desempenho, então esta pode ser uma solução aceitável.

Sim, você pode inserir blocos pré-comprimida em um fluxo de zlib. Comece com o exemplo zpipe.c na fonte zlib. Só onde você quer inserir o bloco de pré-comprimida, substitua Z_NO_FLUSH com Z_FULL_FLUSH (caso contrário, não use Z_FULL_FLUSH porque a taxa de compressão vai sofrer.)

Agora, a saída comprimida é byte alinhados e o último bloco deflate está fechado. meios de descarga completa que o próximo bloco após o bloco de pré-comprimida não pode conter quaisquer referências anteriores.

Anexar seu bloco precompressed no fluxo de saída (por exemplo memcpy). Antecedência strm.next_out para o byte seguinte vazio. Continue com deflate onde você parou.

flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;
ret = deflate(&strm, flush);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top