2010-01-12 37 views
4

我正在尋找一個通用的壓縮庫,它在解壓期間支持隨機訪問。我想將維基百科壓縮成單一壓縮格式,同時我想從中解壓縮/提取單個文章。任何可尋址的壓縮庫?

當然,我可以單獨壓縮每篇文章,但這不會給出太多的壓縮比。我聽說LZO壓縮文件由許多可以單獨解壓縮的塊組成,但是我還沒有找到API +文檔。我也可以在zlib中使用Z_FULL_FLUSH模式,但還有其他更好的選擇嗎?

+1

如果你想隨機訪問,你可能會不得不以這種或那種方式分塊輸入。有什麼更好的方式比那篇文章更好? –

+0

...幾乎所有壓縮庫都支持,文章等同於文件條目。 –

+1

另外...我懷疑單個文章的壓縮率與整個文章的壓縮率之間會有很大差異,因爲它們應該具有基本相同的字母出現率。你有沒有以此爲基準? –

回答

3

xz -format文件支持索引,但默認情況下索引是無用的。我的壓縮器pixz創建包含有用索引的文件。您可以使用liblzma庫中的函數來查找哪些xz數據塊與未壓縮數據中的哪個位置相對應。

+1

看起來像一個有前途的項目。謝謝。 –

0

您還沒有指定操作系統。是否可以將文件存儲在由操作系統管理的壓縮目錄中?那麼你會有「可搜索的」部分以及壓縮。 CPU的開銷將會以不可預知的訪問時間爲您處理。

+0

我更喜歡不同操作系統中的便攜庫。壓縮文件系統當然是一個解決方案,但在隨機訪問下性能表現如何(在速度和內存方面)呢? –

+0

你正在爲速度交易空間。壓縮成本。 –

1

DotNetZip是.NET的zip壓縮文檔庫。

使用DotNetZip,您可以隨機引用zip中的特定條目,並且可以按順序對其進行解壓縮,並且可以返回一個在解壓縮條目時提取條目的流。

隨着這些功能的好處,DotNetZip已被用於執行Virtual Path Provider for ASP.NET,這完全符合您的描述 - 它從壓縮的ZIP文件爲特定網站提供所有內容。您也可以使用動態頁面(ASP.NET)頁面來完成網站。

ASP.NET ZIP Virtual Path Provider, based on 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(); 
     } 
    } 
} 
0

我使用MS Windows Vista中,不幸的是,我可以將文件瀏覽器發送到zip文件,就好像它們是普通文件一樣。據推測,它仍然在7(我想要)上工作。我想我已經用Ubuntu上的相應實用程序完成了這個工作,但我不確定。我想也可以在Mac OSX上測試它。

0

如果單個文章太短而無法獲得體面的壓縮比,那麼下一個最簡單的方法就是打開一批維基百科文章 - 比如說,一次編寫12篇文章,或者填充的文章數量很多一兆字節。 然後獨立壓縮每批。

原則上,它比單獨壓縮每件商品的壓縮效果更好,但是壓縮程度比所有商品一起壓縮的程度要差。 從壓縮批量中提取文章#12需要解壓整個批量(然後丟掉前11個文章),但這仍然比解壓維基百科的一半要快得多。

許多壓縮程序將輸入流分解爲一系列「塊」,並從頭開始壓縮每個塊,與其他塊無關。 您也可以選擇一個關於塊大小的批處理大小 - 較大的批處理不會獲得更好的壓縮比,並且需要更長的時間來解壓縮。

我已經嘗試了幾種方法,使它更容易在中間開始解碼壓縮數據庫。 唉,到目前爲止,我應用的「巧妙」技術仍然具有較差的壓縮比,並且比簡單得多的「批量」方法花費更多的操作來生成解碼部分。

對於更復雜的技術,你可能看

4

爲上的gzip可查找壓縮構建,存在是從獵犬試劑盒

不是字典服務器和sgzip dictzip e你不能寫入其中任何一種,因爲可尋求的是以任何方式讀取

1

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

它是samtools C庫的一部分,真的只是一個簡單的gzip破解工具。如果您不想使用samtools C實現或picard java實現,您可以自己重新編寫它。 Biopython實現了python變體。

+0

它看起來像一個簡單的zlib上的封裝庫。數據分成64k塊並獨立壓縮。但我想可以得到更好的壓縮比。 –

+0

這只是一個簡單的黑客攻擊,但它的工作方式很有用,並且有一個有用的命令行工具。你可能會得到更好的壓縮,但這是現在正在工作的東西。 – Max