5

解凍時のランダム アクセスをサポートする一般的な圧縮ライブラリを探しています。ウィキペディアを単一の圧縮形式に圧縮したいと同時に、そこから個々の記事を解凍/抽出したいと考えています。

もちろん、各記事を個別に圧縮することもできますが、これではあまり圧縮率が高くなりません。LZO圧縮ファイルは、個別に解凍できる多くのチャンクで構成されていると聞いたことがありますが、そのためのAPI +ドキュメントを見つけていません。zlib で Z_FULL_FLUSH モードを使用することもできますが、他のより良い代替手段はありますか?

4

7 に答える 7

4

gzip でのシーク可能な圧縮ビルドの場合、dict サーバーからの dictzip とスルース キットからの sgzip があります。

これらのいずれにも書き込むことはできず、シーク可能であるため、何らかの方法で読み取ることに注意してください

于 2010-08-05T16:51:53.047 に答える
1

DotNetZipは、.NET用のzipアーカイブライブラリです。

DotNetZipを使用すると、zip内の特定のエントリをランダムに参照し、それらを順不同で解凍し、エントリを抽出するときに解凍するストリームを返すことができます。

これらの機能の利点を利用して、DotNetZipはASP.NETの仮想パスプロバイダーの実装内で使用されています。これは、正確に説明したとおりに実行されます。圧縮されたZIPファイルから特定のWebサイトのすべてのコンテンツを提供します。動的ページ(ASP.NET)ページを使用してWebサイトを作成することもできます。

DotNetZipに基づくASP.NETZIP仮想パスプロバイダー

重要なコードは次のようになります。

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 に関する単純なハックです。samtools C 実装または picard Java 実装を使用したくない場合は、おそらく自分で書き直すことができます。Biopython は python バリアントを実装します。

于 2013-08-13T23:35:34.743 に答える
0

残念ながら、私は MS Windows Vista を使用していますが、ファイル エクスプローラーを通常のファイルのように zip ファイルに送信できます。おそらく、それはまだ7で動作します(私はこれを使いたいです)。Ubuntuの対応するユーティリティでもそれを行ったと思いますが、よくわかりません。Mac OSX でもテストできると思います。

于 2010-02-05T17:58:19.807 に答える
0

OS が指定されていません。OSが管理する圧縮ディレクトリにファイルを格納することは可能でしょうか? 次に、「シーク可能な」部分と圧縮があります。CPU オーバーヘッドは、予測できないアクセス時間で処理されます。

于 2010-01-12T03:48:38.333 に答える
0

個々の記事が適切な圧縮率を得るには短すぎる場合、次の最も簡単なアプローチは、Wikipedia の記事のバッチを tar することです。たとえば、一度に 12 記事、または 1 メガバイトを埋めるのに必要な数の記事です。次に、各バッチを個別に圧縮します。

原則として、各記事を個別に圧縮するよりは圧縮率が高くなりますが、すべての記事をまとめて完全に圧縮するよりは圧縮率が低くなります。圧縮されたバッチから記事 #12 を抽出するには、バッチ全体を解凍する必要があります (その後、最初の 11 件の記事を破棄します) が、Wikipedia の半分を解凍するよりもはるかに高速です。

多くの圧縮プログラムは、入力ストリームを一連の「ブロック」に分割し、各ブロックを他のブロックとは別に最初から圧縮します。ブロックのサイズに近いバッチサイズを選択することもできます.バッチサイズが大きいと、圧縮率が向上せず、解凍に時間がかかります.

途中で圧縮されたデータベースのデコードを開始しやすくするために、いくつかの方法を試しました。残念ながら、これまでに適用した「巧妙な」手法は、はるかに単純な「バッチ」アプローチよりも圧縮率が低く、デコードされたセクションを生成するためにより多くの操作が必要です。

より高度なテクニックについては、以下を参照してください。

于 2010-07-28T09:51:30.380 に答える