我正在寻找一个支持解压过程中随机访问的通用压缩库。我想将维基百科压缩为单一压缩格式,同时我想从中解压缩/提取个别文章。

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

有帮助吗?

解决方案

XZ -format文件支持的指标,虽然由缺省索引是没有用的。我的压缩机, pixz ,创建不包含有用的索引文件。可以使用的功能在liblzma库以找到XZ数据的块对应于在未压缩数据位置。

其他提示

有关gzip的可搜索的压缩版本,有一个从从猎犬试剂盒中的字典服务器和sgzip dictzip

请注意,你不能写任一和可搜索正在读什么办法

DotNetZip 是用于.NET zip存档库。

使用DotNetZip,可以参考特定条目随机拉链,并可以解压缩出来的顺序,并且可以返回解压缩为它提取的条目的流。

使用的这些特征的好处,DotNetZip已经在虚拟路径提供对ASP的执行中使用的.NET ,这不正是你的描述 - 它提供了从压缩ZIP文件特定网站的所有内容。你也可以做动态网页(ASP.NET)页的网站。

ASP.NET ZIP虚拟路径提供基于DotNetZip

在重要的代码看起来是这样的:

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

和VirtualFile定义是这样的:

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是在基因组学中使用的格式。 http://biopython.org/DIST/docs/api/Bio.bgzf -module.html

这是samtools C库的一部分,实际只是一个gzip格式的简单的黑客。你也许可以自己动手,如果你不希望使用samtools C实现或皮卡德Java实现重新写。 Biopython实现蟒变体。

您还没有指定您的操作系统。有没有可能你的文件存储在由操作系统管理压缩目录?然后,你将有“可搜索”部分,以及压缩。的CPU开销会为你具有不可预测的访问时间来处理。

我使用的是MS Windows Vista中,不幸的是,我可以发送文件浏览器成zip文件,好像他们是正常的文件。据推测,它仍然工作在7(我想是在其上)。我想我做到了这一点与Ubuntu上,也相应的效用,但我不知道。我还可以测试它在Mac OSX上,我想。

如果个别文章太短而无法获得适当的压缩比,那么下一个最简单的方法是压缩一批维基百科文章 - 例如,一次 12 篇文章,或者无论需要多少文章才能填满 1 MB。然后独立压缩每批。

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

许多压缩程序将输入流分解为一系列“块”,并独立于其他块从头开始压缩每个块。您不妨选择大约一个块大小的批量大小 - 较大的批量不会获得更好的压缩比,并且解压缩需要更长的时间。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top