É possível obter lista de arquivos, intervalo de bytes da cabeça de um arquivo tar + bzip2?

3

Essencialmente, espero que alguém com um conhecimento avançado de tar / bz2 possa responder se isso é possível.

A situação é que temos um feed periódico de 24 GB de dados de um fornecedor, como um arquivo .tbz. (tar + bzip2). Isso é baixado do fornecedor via curl. Para acelerar drasticamente esse processo lento, eu gostaria de obter:

  • Uma lista de arquivos contida no arquivo .tbz
  • os intervalos de bytes dos arquivos específicos que nos interessam (um pequeno subconjunto de todo o arquivo).

Curl tem a capacidade de especificar um intervalo de bytes para fazer o download de um arquivo, então minha esperança é que, se baixarmos os primeiros x bytes de um arquivo, ele pode ter um índice de onde precisamos buscar esses arquivos relevantes. Pelo que entendi, o tar em si tem essa informação, mas não tenho certeza se a compactação bzip2 permite isso além disso.

    
por Excalibur 27.02.2014 / 23:35

1 resposta

3

Não.

Tar é uma concatenação de dados de arquivos, intercalados com metadados de arquivos (cabeçalhos de tarts). Isso por si só não seria necessariamente o beco sem saída, já que se poderia ler o cabeçalho, descobrir o comprimento dos dados e (se o servidor permitisse isso) pular para o próximo cabeçalho (por exemplo, através da mesma funcionalidade que permite retomar as transmissões HTTP).

O que realmente dificulta isso é a compressão - os dados descompactados geralmente dependem dos precedentes, portanto em tudo que o precede. Agora, para bzip2 tudo é um bloco de 100kB a 900kB (com 100kB etapas IIUC). Assim, seu algoritmo teria que:

  1. obtenha o início do arquivo;

  2. leia o comprimento do fragmento descomprimido L no cabeçalho;

  3. descompacte o bloco - isso significa fazer o download dos dados conforme necessário, até o final do o bloco bz2 é alcançado;

  4. verifique o cabeçalho tar e os tamanhos H do cabeçalho tar do primeiro arquivo e D de seus dados;

  5. pule para o próximo arquivo: ele está no bloco decodificado ( H + D L ) ou compactado adicional os dados precisam ser buscados ( H + D > L ). E é exatamente aí que ele quebra - se eu entendi o formato bzip2 corretamente, o cabeçalho não contém o comprimento do bloco comprimido (somente descompactado). Portanto, se você precisar buscar outro bloqueio, não será possível procurar no fluxo, mesmo que o meio subjacente tenha permitido isso.

Resumo: se você puder negociar a mudança de formato para algo que contenha tamanho de bloco compactado em seu cabeçalho, isso poderá ser solucionado. Por outro lado, um arquivo tar 24GB comprimido é um formato bastante insano para distribuição de qualquer coisa - é um BD de camada única e não acho que uma pessoa razoável pensaria em compactar o conteúdo para ir em um disco em um único arquivo, em vez de dividi-lo em partes de no máximo 1-2 GB de tamanho. Então, se a negociação for possível, tente perguntar sobre isso (dividindo-a em pedaços menores).

Outra coisa que poderia ajudá-lo um pouco seria obter a lista de arquivos em conjunto com os tamanhos de arquivo separadamente - isso permitiria que você fizesse pelo menos alguns palpites sobre o que fazer download (e você sempre pode obter os defeitos se necessário) ). Essa lista pode ser produzida facilmente - apenas redirecionando o stdout de tar para um arquivo:

tar cvv all_the_uncompressed_gigabytes 2>list.txt | bzip2 -9 > data.tar.bz2
    
por 28.02.2014 / 00:20