Pergunta

Qual seria o melhor algoritmo de compressão para usar para pacotes de compressa antes de enviá-los ao longo do fio? Os pacotes s codificados usando JSON. Será que LZW ser uma boa para este ou há algo melhor?

Foi útil?

Solução

Eu acho que duas perguntas irá afectar a sua resposta:

1) Como assim você pode prever a composição dos dados sem saber o que vai acontecer em qualquer execução particular do programa? Por exemplo, se seus pacotes parecido com este:

{
    "vector": {
        "latitude": 16,
        "longitude": 18,
        "altitude": 20
    },
    "vector": {
        "latitude": -8,
        "longitude": 13,
        "altitude": -5
    },
    [... et cetera ...]
}

- então você provavelmente obter seu melhor compressão através da criação de um dicionário embutido das cadeias de texto que mantêm aparecendo em seus dados e substitua cada ocorrência de uma das cadeias de texto com o índice dicionário apropriado. (Na verdade, se os seus dados era este regular, você provavelmente deseja enviar apenas os valores sobre o fio e simplesmente escrever uma função para o cliente para construir um objeto JSON a partir dos valores Se for necessário um objeto JSON.)

Se você não pode prever que cabeçalhos será usado, você pode precisar usar LZW, ou LZ77, ou outro método que analisa os dados que já passou por encontrar os dados que podem expressar em uma forma especialmente compacta. No entanto ...

2) Será que os pacotes precisam ser comprimido separadamente um do outro? Se sim, então LZW é definitivamente não o método que você quer; ele não terá tempo para construir seu dicionário até um tamanho que lhe dará resultados de compressão substanciais até o final de um único pacote. A única chance de conseguir a compressão realmente substancial neste cenário, IMHO, é usar um dicionário embutido.

(Adenda ao todos os itens acima: como Michael Kohne assinala, o envio de JSON significa que você provavelmente está enviando todo o texto, o que significa que você é largura de banda subutilização que tem a capacidade de enviar uma gama muito maior de personagens do que você 're usando. no entanto, o problema de como embalar personagens que se enquadram na faixa de 0-127 em recipientes que os valores de retenção 0-255 é bastante simples e eu acho que pode ser deixada como 'um exercício para o leitor', como dizem .)

Outras dicas

Há mais dois algoritmos de compressão JSON: CJson & HPack O HPack faz um trabalho muito bom, comparável à compressão gzip.

Ummm ... me corrija se eu estiver errado, mas se você estiver implementando on-the-wire de compressão, então você controlar ambas as extremidades da conexão, certo? Nesse caso, se JSON é protocolo um muito gordo, por que você não basta escolher um protocolo diferente de arame que não é tão gorda? Quer dizer, eu entender o apelo de usar um padrão como JSON, mas se você está preocupado com a largura de banda, então você provavelmente deve escolher um protocolo de fio que não é todo o texto.

Deixe a compressa webserver ea descomprimir navegador de forma nativa; gzip ou deflate.

Aqui está um pequeno teste sobre a compressibilidade dos dados JSON Original: crime-data_geojson.json 72844By (Você pode obter o arquivo aqui: https://github.com/lsauer/Data-Hub . O arquivo foi escolhido aleatoriamente, mas não pode ser representativa de dados média JSON)

exceto para fechar todos os parâmetros Archiver foram definidos para ultra-

* cm/ nanozip: 
  > 4076/72844
  [1] 0.05595519
* gzip:
  > 6611/72844
  [1] 0.09075559
* LZMA / 7zip
  > 5864/72844
  [1] 0.0805008
* Huffman / zip:
  > 7382/72844
  [1] 0.1013398
* ?/Arc:
  > 4739/72844
  [1] 0.06505683

Isto significa que a compressão é muito alta e benéfico. dados JSON geralmente tem uma elevada entropia. Segundo a Wikipedia

A taxa de entropia do texto em Inglês é entre 1,0 e 1,5 bits por carta, [1] ou tão baixo como 0,6 a 1,3 bits por carta, de acordo com a estimativas de Shannon com base em experiências humanas

A entropia de dados JSON é muitas vezes bem acima disso. (Em um experimento com 10 arquivos JSON arbitrárias de tamanho aproximadamente igual i calculada 2,36)

Gzip (deflate algoritmo) é bom belos à compressão, embora como todos os algoritmos boa compressão, usa muita CPU (3-5x tanto quanto sobrecarga de leitura json / escrever no meu teste).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top