5

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

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

4

7 回答 7

5

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

于 2012-12-20T20:45:45.523 回答
4

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

请注意,您不能写入其中任何一个,并且可以以任何方式阅读

于 2010-08-05T16:51:53.047 回答
1

DotNetZip是 .NET 的 zip 存档库。

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

凭借这些功能的优势,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();
        }
    }
}
于 2010-02-05T17:50:50.663 回答
1

bgzf 是基因组学中使用的格式。 http://biopython.org/DIST/docs/api/Bio.bgzf-module.html

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

于 2013-08-13T23:35:34.743 回答
0

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

于 2010-01-12T03:48:38.333 回答
0

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

于 2010-02-05T17:58:19.807 回答
0

如果单个文章太短而无法获得合适的压缩率,那么下一个最简单的方法是压缩一批 Wikipedia 文章——例如,一次 12 篇文章,或者填满 1 兆字节需要多少篇文章。然后独立压缩每个批次。

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

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

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

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

于 2010-07-28T09:51:30.380 回答