我正在寻找一个在解压过程中支持随机访问的通用压缩库。我想将维基百科压缩成单一的压缩格式,同时我想从中解压缩/提取单个文章。
当然,我可以单独压缩每篇文章,但这不会给出太大的压缩比。我听说 LZO 压缩文件由许多可以单独解压缩的块组成,但我还没有找到 API+文档。我也可以在 zlib 中使用 Z_FULL_FLUSH 模式,但是还有其他更好的选择吗?
我正在寻找一个在解压过程中支持随机访问的通用压缩库。我想将维基百科压缩成单一的压缩格式,同时我想从中解压缩/提取单个文章。
当然,我可以单独压缩每篇文章,但这不会给出太大的压缩比。我听说 LZO 压缩文件由许多可以单独解压缩的块组成,但我还没有找到 API+文档。我也可以在 zlib 中使用 Z_FULL_FLUSH 模式,但是还有其他更好的选择吗?
对于 gzip 上的可搜索压缩构建,有来自 dict 服务器的 dictzip 和来自 sleuth kit 的 sgzip
请注意,您不能写入其中任何一个,并且可以以任何方式阅读
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();
}
}
}
bgzf 是基因组学中使用的格式。 http://biopython.org/DIST/docs/api/Bio.bgzf-module.html
它是 samtools C 库的一部分,实际上只是一个简单的 gzip hack。如果您不想使用 samtools C 实现或 picard java 实现,您可以自己重新编写它。Biopython 实现了一个 python 变体。
您尚未指定您的操作系统。是否可以将您的文件存储在操作系统管理的压缩目录中?然后您将拥有“可搜索”部分以及压缩。CPU 开销将为您处理不可预测的访问时间。
不幸的是,我使用的是 MS Windows Vista,我可以将文件资源管理器发送到 zip 文件中,就像它们是普通文件一样。大概它仍然适用于 7 (我想加入)。我想我也用 Ubuntu 上的相应实用程序做到了这一点,但我不确定。我想我也可以在 Mac OSX 上测试它。
如果单个文章太短而无法获得合适的压缩率,那么下一个最简单的方法是压缩一批 Wikipedia 文章——例如,一次 12 篇文章,或者填满 1 兆字节需要多少篇文章。然后独立压缩每个批次。
原则上,这比单独压缩每篇文章的压缩效果更好,但比将所有文章整体压缩在一起的压缩效果更差。从压缩批次中提取第 12 篇文章需要解压缩整个批次(然后将前 11 篇文章扔掉),但这仍然比解压缩 Wikipedia 的一半要快得多。
许多压缩程序将输入流分解为一系列“块”,并独立于其他块从头开始压缩每个块。您还不如选择一个块大小的批处理大小——较大的批处理不会获得更好的压缩比,并且需要更长的时间来解压缩。
我已经尝试了几种方法来使在中间开始解码压缩数据库变得更容易。唉,到目前为止,我应用的“聪明”技术仍然具有更差的压缩率,并且比更简单的“批处理”方法需要更多的操作来生成解码部分。
对于更复杂的技术,您可以查看