Explicações · um

Como funciona o descarregamento de passagem única

A maior parte do que torna este cliente rápido não é um caminho de rede mais veloz. É que os dados se movem uma só vez. Isto é o que isso significa na prática, porque é coisa diferente do desempacotamento direto, que formas de arquivo lhe sobrevivem, e quanto vale mesmo, numa máquina real, eliminar o ciclo de escrever e voltar a ler.

O ponto de partida

O que um descarregamento da Usenet faz tradicionalmente

Um post são milhares de pequenos artigos codificados que juntos formam um conjunto de volumes de arquivo, os quais por sua vez contêm o ficheiro que queres de facto. Ir de um ao outro foram tradicionalmente quatro tarefas separadas, cada uma a terminar antes de a seguinte começar.

  1. Descarregar e descodificar. Buscar cada artigo, descodificá-lo, e escrever no disco os volumes de arquivo recompostos. Para um lançamento de 60 GB são 60 GB escritos.
  2. Verificar. Voltar a ler os 60 GB do disco para os conferir com os dados de paridade, e repará-los se algo estiver mal.
  3. Desempacotar. Ler os volumes outra vez, e escrever o conteúdo extraído ao lado deles. Agora há 120 GB no disco.
  4. Limpar. Apagar os volumes, deixando o conteúdo.

Cada etapa está correta, e o resultado está certo. Mas o conteúdo foi escrito duas vezes, lido pelo menos duas vezes, e no ponto mais alto o disco teve de albergar duas cópias completas de uma tarefa de que só querias uma cópia. O cronómetro que tu vives são as quatro etapas em sequência, e é por isso que um cliente pode anunciar um descarregamento rápido e ainda assim deixar-te à espera.

A mudança

Fazê-lo uma só vez em vez disso

Passagem única significa que os bytes vão da rede ao seu destino final sem nunca se tornarem um ficheiro de arquivo no teu disco. Não há etapa dois nem três, porque o trabalho de ambas acontece enquanto a etapa um ainda decorre.

Na prática, à medida que cada artigo chega é descodificado em memória e entregue logo a duas coisas ao mesmo tempo. O verificador confere-o de imediato com os dados de paridade, portanto a correção fica estabelecida enquanto os dados aterram e não relendo-os mais tarde. O extrator trata os bytes que chegam como uma posição dentro do arquivo, calcula a que parte de que ficheiro de conteúdo pertencem, e escreve-os aí.

Os volumes do arquivo nunca são montados. Existem como uma estrutura que o extrator entende enquanto o descarregamento vai em voo, e a única coisa que chega ao teu disco é o ficheiro que querias. Quando chega o último artigo praticamente nada resta por fazer, e é por isso que os nossos tempos de chegada ficam perto do próprio tempo de descarregamento e não de um descarregamento mais uma cauda.

A consequência mensurável: para a mesma tarefa escrevemos cerca de metade, relemos muito menos, e precisamos aproximadamente do próprio tamanho do conteúdo em espaço livre e não do dobro. Num lançamento de 190 GB isso são cerca de 157 GB de espaço livre contra cerca de 313 GB, e aproximadamente um terço do tráfego de disco.

Duas coisas tornam isto mais difícil do que parece, e são a razão de ser pouco comum. Os artigos não chegam por ordem, portanto o extrator tem de lidar com bytes a aterrar em posições arbitrárias em vez de como um fluxo desde o início. E um arquivo comprimido não pode ser descomprimido a partir do meio, portanto qualquer parte do trabalho que exija mesmo ordem tem de ser reconhecida e tratada de outra maneira em vez de dada como resolvida.

A comparação que nos perguntam

Porque isto não é desempacotamento direto

O desempacotamento direto é uma boa funcionalidade e os clientes que a têm ficam a ganhar. Também resolve outra parte do problema, e a diferença aparece exatamente onde importa.

O desempacotamento direto começa a extrair antes de o descarregamento ter terminado, de modo que a etapa três se sobrepõe à etapa um em vez de a seguir. O que não faz é eliminar a etapa um. Os volumes do arquivo continuam a ser escritos por inteiro no teu disco, porque o desempacotador é um convencional que lê ficheiros convencionais; o desempacotamento direto limita-se a arrancá-lo mais cedo. As duas cópias continuam a existir, as duas escritas continuam a acontecer, e a necessidade de espaço livre não muda.

escrever os volumes no discoespaço livre necessáriovezes que o conteúdo é escrito
Descarregar, depois desempacotarsim, depois releitura~2× a tarefa2
Desempacotamento diretosim, relido mais cedo~2× a tarefa2
Passagem únicanunca escritos~1× a tarefa1

A segunda diferença é o que acontece quando a forma não é simples. Como o desempacotamento direto entrega o trabalho a um desempacotador convencional à medida que os volumes aparecem, precisa que a situação seja desimpedida: os volumes presentes numa ordem utilizável, nenhuma reparação pendente, nada que tenha de ser desbloqueado primeiro, e um arquivo cujo conteúdo não sejam ele próprio arquivos. Quando alguma dessas coisas falha, o sensato é recuar e recorrer a desempacotar no fim, e é isso que acontece. Obténs um resultado correto e os tempos habituais.

Como o nosso extrator é construído desde o início em torno de bytes fora de ordem, essas situações não são exceções para ele. É essa a verdadeira distinção: não que comecemos mais cedo, mas que não dependemos de condições que muitas vezes não se verificam.

O que lhe sobrevive de facto

As formas que aguenta

Um desenho destes só vale a pena se se aplicar aos posts que encontras mesmo, e não a um caso ideal limpo. A posição atual: nenhum formato de contentor é tratado apenas em disco. RAR, 7z e zip passam todos pelo caminho de passagem única.

formapassagem únicanotas
RAR, armazenado (sem compressão)simo caso comum nos lançamentos multimédia
RAR, comprimidosimincluindo um arquivo comprimido como camada exterior
RAR 1.5, 3, 4 e 5simas quatro gerações do formato
7zsimincluindo conteúdos comprimidos com deflate
zipsimincluindo conteúdos bzip2 e LZMA
Conteúdos cifradossimcom palavra-passe, incluindo zip cifrado
Cabeçalhos cifradossimquando também os nomes dos ficheiros estão ocultos
Cadeias de palavras-passesima palavra-passe de cada camada guardada na camada acima
Arquivos aninhadossimdesaninhados em andamento, até uma profundidade configurável
Danificado em várias camadassimreparação em cada nível, ainda numa só passagem
Conjuntos divididos numericamentesimdivisões ao estilo name.001
Arquivos autoextraíveispassagem em discoo arquivo não começa no início do ficheiro
Zip repartido (.z01)passagem em discoe algumas variantes de zip mais raras
Tarefas retomadaspassagem em discouma tarefa continuada após um reinício termina de modo convencional

As três recusas são honestas e comportam-se todas do mesmo modo: a tarefa conclui-se corretamente, pela via convencional, e para esse descarregamento obténs os tempos habituais com duas cópias. Nada falha; apenas deixa de ser rápido da maneira que o resto desta página descreve. Os arquivos autoextraíveis são recusados por uma razão estrutural e não por falta de empenho: identificar um arquivo pelos seus primeiros bytes não pode funcionar quando os primeiros bytes são um programa.

As linhas de aninhado e cifrado são as que vale a pena levar a sério, porque é aí que a maioria dos clientes te devolve a tarefa. Num corpus gerado de dez formas aninhadas, avaliado por resumo do conteúdo para que um cliente que renomeie o conteúdo continue a ter crédito, concluímos 9 de 10 sem intervenção; o cliente seguinte concluiu 5, e outros dois concluíram 2. A que não concluímos automaticamente é uma escada de dez níveis, que termina limpa no limite de profundidade predefinido de cinco deixando a camada mais funda como arquivo saudável, e conclui-se por inteiro se subires o limite. Essas voltas estão na página de benchmarks com a grelha completa.

Porque vale a pena fazê-lo

O que eliminar a ida e volta traz de facto

É mais rápido, por uma razão pouco vistosa. Escrever 60 GB e voltar a lê-los não é gratuito nem mesmo num disco de estado sólido rápido, e em qualquer coisa mais lenta é muitas vezes o verdadeiro estrangulamento em vez da rede. Tirar uma escrita e duas leituras tira esse tempo por inteiro do teu cronómetro. O ganho é maior exatamente onde mais se nota: tarefas grandes, e máquinas cujo disco não é a sua parte mais rápida.

Reduz o desgaste a metade. Os discos de estado sólido têm dentro um número finito de escritas, e um descarregador que escreve cada conteúdo duas vezes gasta esse orçamento ao dobro do ritmo sem qualquer benefício para ti. Ao longo de umas centenas de terabytes descarregados, o que é um ano normal para um utilizador ativo, a diferença é uma fração apreciável da vida de um disco.

Muda o que cabe. O espaço livre não é uma característica de desempenho, é um sim ou não. Uma tarefa que precisa do dobro do seu próprio tamanho de folga ou corre ou não corre. Precisar de cerca do tamanho do conteúdo significa que há tarefas que se concluem em máquinas e volumes onde a abordagem convencional simplesmente para, e é por isso que um lançamento de 190 GB cabe aqui em cerca de 157 GB de espaço livre e não em cerca de 313 GB.

Custa menos tempo de processador. Não fazer passar os dados duas vezes pelo disco elimina o trabalho de o fazer, e verificar durante o descarregamento significa nenhuma segunda passagem sobre o conteúdo para o conferir. O nosso custo de processador mantém-se plano em cerca de 1.7 segundos de processador por gigabyte, de uma tarefa de 35 GB a uma de 190 GB, e é essa a propriedade útil: o custo por gigabyte não cresce à medida que a tarefa cresce.

Corre com menos memória, e com memória limitada. Como os bytes são consumidos à medida que chegam em vez de acumulados, o conjunto de trabalho é um orçamento que defines e não uma função do tamanho da tarefa. É isso que permite processar um lançamento de 190 GB numa máquina com aproximadamente 1.1 GB disponíveis. A distinção que importa não é o número mas a forma: memória que cresce com a tarefa acabará por encontrar uma tarefa que a tua máquina não consegue terminar, e falha por troca para disco ou por ser abatida em vez de te avisar.

No conjunto, isto é menos sobre ganhar um benchmark do que sobre onde o programa consegue sequer correr. Um desenho que precisa de metade do espaço livre, metade das escritas e uma quantidade limitada de memória funciona num pequeno servidor doméstico, num portátil mais velho ou num NAS, e é aí que vive boa parte deste software.

Todos os valores desta página são medidos e publicados com a compilação e a data ao lado na página de benchmarks, incluindo as voltas que perdemos. O contrapeso honesto, dito também ali: um extrator e um reparador construídos para acompanhar um descarregamento em curso mantêm mais memória residente do que uma ferramenta autónoma corrida uma vez a partir da linha de comandos, portanto se a tua restrição é a menor pegada possível para uma tarefa única sobre um ficheiro que já tens, as ferramentas dedicadas ganham essa coluna.