Compression 有什么可查找的压缩库吗?

Compression 有什么可查找的压缩库吗?,compression,seek,random-access,Compression,Seek,Random Access,我正在寻找一个通用的压缩库,它支持解压缩期间的随机访问。我想把维基百科压缩成一种单一的压缩格式,同时我想从中解压/提取单个文章 当然,我可以单独压缩每一篇文章,但这不会提供太多的压缩比。我听说LZO压缩文件由许多块组成,这些块可以单独解压缩,但我还没有找到这方面的API+文档。我也可以在zlib中使用Z_FULL_FLUSH模式,但是还有其他更好的选择吗?您还没有指定您的操作系统。是否可以将您的文件存储在操作系统管理的压缩目录中?然后,您将拥有“可搜索”部分以及压缩。CPU开销将在访问时间不可预

我正在寻找一个通用的压缩库,它支持解压缩期间的随机访问。我想把维基百科压缩成一种单一的压缩格式,同时我想从中解压/提取单个文章


当然,我可以单独压缩每一篇文章,但这不会提供太多的压缩比。我听说LZO压缩文件由许多块组成,这些块可以单独解压缩,但我还没有找到这方面的API+文档。我也可以在zlib中使用Z_FULL_FLUSH模式,但是还有其他更好的选择吗?

您还没有指定您的操作系统。是否可以将您的文件存储在操作系统管理的压缩目录中?然后,您将拥有“可搜索”部分以及压缩。CPU开销将在访问时间不可预测的情况下为您处理。

是.NET的zip存档库

使用DotNetZip,您可以随机引用zip中的特定条目,并可以无序解压缩它们,还可以返回在提取条目时解压缩的流

得益于这些功能,DotNetZip已经在实现中使用,这正是您所描述的——它通过压缩的ZIP文件为特定网站提供所有内容。您还可以使用动态页面(ASP.NET)页面创建网站

重要的代码如下所示:

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;
        }
    }
}
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();
        }
    }
}
VirtualFile的定义如下:

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

不幸的是,我使用的是MS Windows Vista,我可以将文件资源管理器发送到zip文件中,就好像它们是普通文件一样。大概它在7频道仍然有效(我想在7频道)。我想我已经在Ubuntu上使用了相应的实用程序,但我不确定。我想,我也可以在Mac OSX上测试它。

如果单个文章太短,无法获得合适的压缩比,下一个最简单的方法是对一批Wikipedia文章进行压缩——比如说,一次12篇文章,或者一个兆字节需要多少篇文章。 然后分别压缩每个批次

原则上,这比单独压缩每篇文章提供更好的压缩效果,但比将所有文章整体压缩效果差。 从一个压缩的批处理中提取第12篇文章需要解压缩整个批处理(然后扔掉前11篇文章),但这仍然比解压缩维基百科的一半快得多

许多压缩程序将输入流分解为一系列“块”,并独立于其他块从头开始压缩每个块。 您还可以选择一个大约块大小的批处理大小——较大的批处理无法获得更好的压缩比,解压缩需要更长的时间

我已经尝试了几种方法来简化中间压缩数据库的解码。 唉,到目前为止,我所应用的“聪明”技术仍然比更简单的“批处理”方法具有更差的压缩比,并且需要更多的操作来生成解码部分

对于更复杂的技术,您可以查看

  • MG4J:
  • ”“伊恩·H·维顿, 阿利斯泰尔·莫法特和蒂莫西·贝尔

对于在gzip上构建的可查找压缩,有来自dict服务器的dictzip和来自sleuth kit的sgzip


请注意,您不能对其中任何一个进行写入,因为seekable正在以任何方式进行读取

-格式文件支持索引,尽管默认情况下索引没有用处。我的压缩器,创建包含有用索引的文件。您可以使用liblzma库中的函数来查找xz数据块与未压缩数据中的哪个位置相对应。

bgzf是基因组学中使用的格式。


它是samtools C库的一部分,实际上只是对gzip的一个简单攻击。如果不想使用samtools C实现或picard java实现,您可能可以自己重新编写它。Biopython实现了一个python变体。

如果您想要随机访问,您可能需要以某种方式对输入进行分块。还有什么比文章更好的分块方式?。。。几乎所有的压缩库都支持它,这篇文章相当于一个文件条目。。。我怀疑在单个文章的压缩比与整个文章的压缩比之间会有很大的差异,因为它们的字母出现率应该基本相同。您是否对这一说法进行了基准测试?单独压缩文章的问题在于,您最终会得到一整批文件,这本身就导致了效率低下。比如说,拥有一个1G的文件将比拥有80000个文件(每个文件平均约10K)更节省空间,更易于使用,即使压缩更大。我更喜欢在不同的操作系统之间使用一个可移植的库。压缩文件系统当然是一个解决方案,但它在随机访问下是否表现良好(在速度和内存方面)?你在用空间换取速度。压缩成本。@NoRefundsNoReturns至少今天的磁盘驱动器比CPU慢得多,所以从压缩文件系统读取速度更快(至少在这里的ZFS上),除非每个CPU的CPU负载已经超过1。谢谢。我迫不及待地想看看2030年的读者会说些什么。有没有一个徽章可以用来发表十年前的评论?如果不是的话,我可以为这项成就推荐几年来的
?看起来是一个很有希望的项目。谢谢。它看起来像是zlib之上的一个简单包装器库。数据被分割成64k块并独立压缩。但我想人们可以得到更好的压缩比。这只是一个简单的破解,但它是开箱即用的,并且有一个有用的命令行工具。您可能会得到更好的压缩,但这是一些工作,现在。