Deflate compressão riacho onde pré comprimido Os dados podem ser inseridos. Faz um exist .NET lib?
-
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?
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);