Pergunta

Estou procurando uma biblioteca geral de compressão que suporta acesso aleatório durante a descompressão. Quero comprimir a Wikipedia em um único formato compactado e, ao mesmo tempo, quero descomprimir/extrair artigos individuais.

Obviamente, posso comprimir cada artigos individualmente, mas isso não dará muita taxa de compressão. Ouvi o arquivo compactado LZO consiste em muitos pedaços que podem ser descomprimidos separadamente, mas não descobri a documentação da API+para isso. Também posso usar o modo z_full_flush no Zlib, mas há outra alternativa melhor?

Foi útil?

Solução

xz-Format Arquivos suportam um índice, embora por padrão o índice não seja útil. Meu compressor, pixz, cria arquivos que contêm um índice útil. Você pode usar as funções na biblioteca Liblzma para descobrir qual bloco de dados XZ corresponde a qual local nos dados não compactados.

Outras dicas

Para compactação buscável, construir o GZIP, há dictzip do servidor Dict e SGZIP do Sleuth Kit

Observe que você não pode escrever para nenhum deles e, como buscável, está lendo de qualquer maneira

Dotnetzip é uma biblioteca Zip Archive para .Net.

Usando o DotNetzip, você pode fazer referência a entradas específicas no zip aleatoriamente e pode descomprimi -las fora de ordem e retornar um fluxo que descomprima à medida que extrai uma entrada.

Com o benefício desses recursos, o dotnetzip foi usado na implementação de um Provedor de caminho virtual para asp.net, isso faz exatamente o que você descreve - serve todo o conteúdo de um site específico de um arquivo zip compactado. Você também pode fazer sites com páginas dinâmicas (ASP.NET).

Provedor de caminho virtual do ASP.NET ZIP, com base no DotNetzip

O código importante se parece com o seguinte:

namespace Ionic.Zip.Web.VirtualPathProvider
{
    public class ZipFileVirtualPathProvider : System.Web.Hosting.VirtualPathProvider
    {
        ZipFile _zipFile;

        public ZipFileVirtualPathProvider (string zipFilename) : base () {
            _zipFile =  ZipFile.Read(zipFilename);
        }

        ~ZipFileVirtualPathProvider () { _zipFile.Dispose (); }

        public override bool FileExists (string virtualPath)
        {
            string zipPath = Util.ConvertVirtualPathToZipPath (virtualPath, true);
            ZipEntry zipEntry = _zipFile[zipPath];

            if (zipEntry == null)
                return false;

            return !zipEntry.IsDirectory;
        }

        public override bool DirectoryExists (string virtualDir)
        {
            string zipPath = Util.ConvertVirtualPathToZipPath (virtualDir, false);
            ZipEntry zipEntry = _zipFile[zipPath];

            if (zipEntry != null)
                return false;

            return zipEntry.IsDirectory;
        }

        public override VirtualFile GetFile (string virtualPath)
        {
            return new ZipVirtualFile (virtualPath, _zipFile);
        }

        public override VirtualDirectory GetDirectory (string virtualDir)
        {
            return new ZipVirtualDirectory (virtualDir, _zipFile);
        }

        public override string GetFileHash(string virtualPath, System.Collections.IEnumerable virtualPathDependencies)
        {
            return null;
        }

        public override System.Web.Caching.CacheDependency GetCacheDependency(String virtualPath, System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart)
        {
            return null;
        }
    }
}

E o VirtualFile é definido assim:

namespace Ionic.Zip.Web.VirtualPathProvider
{
    class ZipVirtualFile : VirtualFile
    {
        ZipFile _zipFile;

        public ZipVirtualFile (String virtualPath, ZipFile zipFile) : base(virtualPath) {
            _zipFile = zipFile;
        }

        public override System.IO.Stream Open () 
        {
            ZipEntry entry = _zipFile[Util.ConvertVirtualPathToZipPath(base.VirtualPath,true)];
            return entry.OpenReader();
        }
    }
}

BGZF é o formato usado na genômica.http://biopython.org/dist/docs/api/bio.bgzf-module.html

Faz parte da biblioteca Samtools C e realmente apenas um simples hacker em torno do GZIP. Você provavelmente pode reescrever você mesmo se não quiser usar a implementação Samtools C ou a implementação do Picard Java. Biopython implementa uma variante Python.

Você não especificou seu sistema operacional. Seria possível armazenar seu arquivo em um diretório compactado gerenciado pelo sistema operacional? Então você teria a parte "buscável", bem como a compressão. A sobrecarga da CPU será tratada para você com tempos de acesso imprevisíveis.

Infelizmente, estou usando o MS Windows Vista e posso enviar o File Explorer para os arquivos ZIP como se fossem arquivos normais. Presumivelmente, ele ainda funciona no 7 (o que eu gostaria de estar). Acho que fiz isso com o utilitário correspondente no Ubuntu, mas não tenho certeza. Eu também poderia testá -lo no Mac OSX, suponho.

Se os artigos individuais forem muito curtos para obter uma taxa de compressão decente, a próxima abordagem mais simples é esticar um lote de artigos da Wikipedia-digamos, 12 artigos por vez, ou quantos artigos são necessários para preencher um megabyte. Em seguida, compacte cada lote de forma independente.

Em princípio, isso oferece melhor compressão do que a compactação de cada artigo individualmente, mas pior compressão do que a compressão sólida de todos os artigos juntos. Extrair o artigo 12 de um lote compactado requer descomprimir todo o lote (e depois jogar os 11 primeiros artigos de fora), mas isso ainda é muito, muito mais rápido do que descomprimir metade da Wikipedia.

Muitos programas de compressão dividem o fluxo de entrada em uma sequência de "blocos" e comprime cada bloco do zero, independentemente dos outros blocos. Você também pode escolher um tamanho de lote do tamanho de um bloco - lotes maiores não terão melhor taxa de compressão e levará mais tempo para descomprimir.

Eu experimentei várias maneiras de facilitar o início da decodificação de um banco de dados compactado no meio. Infelizmente, até agora as técnicas "inteligentes" que apliquei ainda têm uma taxa de compressão pior e toma mais operações para produzir uma seção decodificada do que a abordagem de "lote" muito mais simples.

Para técnicas mais sofisticadas, você pode olhar

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