Pregunta

Estoy buscando una biblioteca general de compresión que soporta acceso aleatorio durante la descompresión. Quiero comprimir Wikipedia en un solo formato comprimido y al mismo tiempo quiero descomprimir / extraer artículos individuales de la misma.

Por supuesto, puedo comprimir cada artículo individual, pero esto no va a dar mucho la relación de compresión. He oído archivo comprimido lzo consiste en muchos trozos que pueden ser descomprimidos por separado, pero no he encontrado a cabo API + documentación para eso. También puede utilizar el modo Z_FULL_FLUSH en zlib, pero ¿hay alguna otra alternativa mejor?

¿Fue útil?

Solución

xz archivos -format soportan un índice, aunque por defecto el índice no es útil. Mi compresor, pixz , crea archivos que contienen un índice útil. Puede utilizar las funciones de la biblioteca liblzma para encontrar qué bloque de datos a la que corresponde xz ubicación en los datos sin comprimir.

Otros consejos

para reubicable acumulación de compresión de gzip, no es dictzip desde el servidor dict y sgzip de Sleuth Kit

Tenga en cuenta que no se puede escribir en cualquiera de estos y como reubicable es la lectura de alguna manera

DotNetZip es una biblioteca de archivo zip para .NET.

El uso de DotNetZip, puede hacer referencia entradas en particular en el zip de forma aleatoria, y puede descomprimirlos fuera de orden, y puede devolver una secuencia que descomprime ya que extrae una entrada.

Con el beneficio de esas características, DotNetZip se ha utilizado en la implementación de un href="http://support.microsoft.com/kb/910441" rel="nofollow noreferrer"> Proveedor de ruta virtual , que hace exactamente lo que usted describe - que sirve todo el contenido de un sitio web en particular de un archivo ZIP comprimido. También se puede hacer sitios web con páginas dinámicas páginas (ASP.NET).

ASP.NET ZIP Proveedor de ruta virtual , basado en DotNetZip

El código importante es el siguiente:

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;
        }
    }
}

Y VirtualFile se define así:

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 es el formato utilizado en la genómica. http://biopython.org/DIST/docs/api/Bio.bgzf -module.html

Es parte de la biblioteca samtools C y en realidad sólo un simple truco alrededor de gzip. Es probable que pueda volver a escribir por sí mismo si no desea utilizar la aplicación samtools C o la aplicación java Picard. Biopython implementa una variante pitón.

No ha especificado su sistema operativo. ¿Sería posible almacenar el archivo en un directorio comprimido administrado por el sistema operativo? De allí tendría que tener la porción "reubicable", así como la compresión. La sobrecarga de la CPU se manejará para usted con tiempos de acceso impredecibles.

Estoy usando MS Windows Vista, por desgracia, y puedo enviar el explorador de archivos en archivos zip como si fueran archivos normales. Es de suponer que todavía funciona en 7 (que me gustaría estar encendido). Creo que lo he hecho con la utilidad correspondiente en Ubuntu, también, pero no estoy seguro. También pude probarlo en Mac OS X, supongo.

Si los artículos individuales son demasiado cortas para conseguir una relación de compresión decente, el enfoque de la próxima más simple es el alquitrán de un lote de artículos de Wikipedia - dicen, 12 artículos a la vez, o sin embargo muchos artículos que se necesita para llenar un megabyte. Entonces comprimir cada lote de forma independiente.

En principio, que le da una mejor compresión de la compresión de cada artículo individual, pero peor que la compresión de compresión sólida de todos los artículos juntos. Extraer el artículo # 12 de un lote comprimido requiere descomprimir todo el lote (y luego lanzar los primeros 11 artículos de distancia), pero que todavía es mucho, mucho más rápido que la descompresión de la mitad de Wikipedia.

Muchos programas de compresión rompen el flujo de entrada en una secuencia de "bloques", y la comprimen cada bloque a partir de cero, independientemente de los otros bloques. Es lo mismo que elegir un tamaño de lote aproximadamente el tamaño de un bloque -. Lotes más grandes no van a conseguir nada mejor relación de compresión, y tomará más tiempo para descomprimir

He experimentado con varias formas de hacer que sea más fácil para iniciar la decodificación de una base de datos comprimido en el medio. Por desgracia, hasta ahora las técnicas de "inteligentes" que he solicitado todavía tienen una peor relación de compresión y toman más operaciones para producir una sección decodificada que el enfoque mucho más simple "por lotes".

Para las técnicas más sofisticadas, lo podría hacer en

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top