我正在尋找一個通用的壓縮庫,它在解壓期間支持隨機訪問。我想將維基百科壓縮成單一壓縮格式,同時我想從中解壓縮/提取單個文章。任何可尋址的壓縮庫?
當然,我可以單獨壓縮每篇文章,但這不會給出太多的壓縮比。我聽說LZO壓縮文件由許多可以單獨解壓縮的塊組成,但是我還沒有找到API +文檔。我也可以在zlib中使用Z_FULL_FLUSH模式,但還有其他更好的選擇嗎?
我正在尋找一個通用的壓縮庫,它在解壓期間支持隨機訪問。我想將維基百科壓縮成單一壓縮格式,同時我想從中解壓縮/提取單個文章。任何可尋址的壓縮庫?
當然,我可以單獨壓縮每篇文章,但這不會給出太多的壓縮比。我聽說LZO壓縮文件由許多可以單獨解壓縮的塊組成,但是我還沒有找到API +文檔。我也可以在zlib中使用Z_FULL_FLUSH模式,但還有其他更好的選擇嗎?
您還沒有指定操作系統。是否可以將文件存儲在由操作系統管理的壓縮目錄中?那麼你會有「可搜索的」部分以及壓縮。 CPU的開銷將會以不可預知的訪問時間爲您處理。
我更喜歡不同操作系統中的便攜庫。壓縮文件系統當然是一個解決方案,但在隨機訪問下性能表現如何(在速度和內存方面)呢? –
你正在爲速度交易空間。壓縮成本。 –
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();
}
}
}
我使用MS Windows Vista中,不幸的是,我可以將文件瀏覽器發送到zip文件,就好像它們是普通文件一樣。據推測,它仍然在7(我想要)上工作。我想我已經用Ubuntu上的相應實用程序完成了這個工作,但我不確定。我想也可以在Mac OSX上測試它。
如果單個文章太短而無法獲得體面的壓縮比,那麼下一個最簡單的方法就是打開一批維基百科文章 - 比如說,一次編寫12篇文章,或者填充的文章數量很多一兆字節。 然後獨立壓縮每批。
原則上,它比單獨壓縮每件商品的壓縮效果更好,但是壓縮程度比所有商品一起壓縮的程度要差。 從壓縮批量中提取文章#12需要解壓整個批量(然後丟掉前11個文章),但這仍然比解壓維基百科的一半要快得多。
許多壓縮程序將輸入流分解爲一系列「塊」,並從頭開始壓縮每個塊,與其他塊無關。 您也可以選擇一個關於塊大小的批處理大小 - 較大的批處理不會獲得更好的壓縮比,並且需要更長的時間來解壓縮。
我已經嘗試了幾種方法,使它更容易在中間開始解碼壓縮數據庫。 唉,到目前爲止,我應用的「巧妙」技術仍然具有較差的壓縮比,並且比簡單得多的「批量」方法花費更多的操作來生成解碼部分。
對於更復雜的技術,你可能看
爲上的gzip可查找壓縮構建,存在是從獵犬試劑盒
不是字典服務器和sgzip dictzip e你不能寫入其中任何一種,因爲可尋求的是以任何方式讀取
bgzf是基因組學中使用的格式。 http://biopython.org/DIST/docs/api/Bio.bgzf-module.html
它是samtools C庫的一部分,真的只是一個簡單的gzip破解工具。如果您不想使用samtools C實現或picard java實現,您可以自己重新編寫它。 Biopython實現了python變體。
它看起來像一個簡單的zlib上的封裝庫。數據分成64k塊並獨立壓縮。但我想可以得到更好的壓縮比。 –
這只是一個簡單的黑客攻擊,但它的工作方式很有用,並且有一個有用的命令行工具。你可能會得到更好的壓縮,但這是現在正在工作的東西。 – Max
如果你想隨機訪問,你可能會不得不以這種或那種方式分塊輸入。有什麼更好的方式比那篇文章更好? –
...幾乎所有壓縮庫都支持,文章等同於文件條目。 –
另外...我懷疑單個文章的壓縮率與整個文章的壓縮率之間會有很大差異,因爲它們應該具有基本相同的字母出現率。你有沒有以此爲基準? –