Pergunta

Esta pode cair no reino do "não é realmente viável" ou "não é realmente vale o esforço", mas aqui vai.

Eu estou tentando registros aleatoriamente de acesso armazenados dentro de um arquivo gzip multi-parte. Especificamente, os arquivos que eu estou interessado em são comprimidos Heretrix arquivos Arc. (No caso de você não estiver familiarizado com arquivos gzip multi-parte, o gzip especificação permite que múltiplos gzip córregos de ser concatenados em um único arquivo gzip. Eles não compartilham qualquer informação dicionário, é simples acrescentando binário.)

Eu estou pensando que deve ser possível fazer isso, procurando um deslocamento dentro do arquivo certo, então varredura para os bytes de cabeçalho gzip magia (ou seja 0x1f8b, de acordo com o RFC ), e tentar ler o fluxo gzip a partir dos seguintes bytes. O problema com esta abordagem é que esses mesmos bytes podem aparecer dentro os dados reais, bem como, de modo que procuram por esses bytes pode levar a uma posição inválida para começar a ler um fluxo gzip partir. Existe uma maneira melhor de lidar com acesso aleatório, uma vez que os deslocamentos gravadoras não são conhecidos a priori?

Foi útil?

Solução

O projeto do GZIP, como você percebeu, não é amigável para acesso aleatório.

Você pode fazer como você descreve, e, em seguida, se você tiver um erro no descompressor, concluir que a assinatura que encontrou foi realmente dados comprimidos.
Se você terminar de descompressão, então é fácil de verificar a validade do fluxo apenas descomprimido, através do CRC32.

Se os arquivos não são tão grandes, você pode considerar apenas de-comprimir todas as entradas em série, e reter os deslocamentos das assinaturas, de modo a construir um diretório. Como você descompactar, despejar os bytes para um balde bit. Nesse ponto, você terá gerado um diretório, e então você pode apoiar o acesso aleatório com base no nome do arquivo, data ou outros metadados.

Esta será razoavelmente rápido para arquivos abaixo de 100k. Assim como um palpite, se você tivesse 10 arquivos de cerca de 100k cada, seria provavelmente ser feito em 2s em uma CPU moderna. Isto é o que quero dizer com "muito rápido". Mas só você sabe os requisitos perf de sua aplicação.

Você tem uma classe GZIPInputStream? Se assim que você é meio caminho lá.

Outras dicas

O BGZF formato de arquivo, compatível com GZIP foi desenvolvido pelos biólogos.

(...) A vantagem de BGZF gzip sobre convencional é que BGZF permite a busca sem ter de percorrer todo o arquivo até a posição que está sendo procurado.

Na http: / /picard.svn.sourceforge.net/viewvc/picard/trunk/src/java/net/sf/samtools/util/ , ter um olhar para BlockCompressedOutputStream e BlockCompressedInputStream.java

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