11

複数のストリーム操作を連鎖させたい(ファイルのダウンロード、オンザフライでの解凍、一時ファイルなしでのデータの処理など)。ファイルは7z形式です。利用可能なLZMASDKがありますが、ストリーム自体ではなく、外部の出力ストリームを作成する必要があります。つまり、出力ストリームを操作するには、出力ストリームを完全に書き込む必要があります。SevenZipSharpにもこの機能が欠けているようです。

誰かがそのようなことをしましたか?

// in pseudo-code - CompressedFileStream derives from Stream
foreach (CompressedFileStream f in SevenZip.UncompressFiles(Web.GetStreamFromWeb(url))
{
    Console.WriteLine("Processing file {0}", f.Name);
    ProcessStream( f ); // further streaming, like decoding, processing, etc
}

各ファイルストリームは、1つのファイルを表す1回限りのストリームのように動作し、メインの圧縮ストリームでMoveNext()を呼び出すと、そのファイルは自動的に無効化されてスキップされます。

圧縮についても同様の構成を行うことができます。使用例-非常​​に大量のデータに対して何らかの集計を行います-dir内の7zファイルごと、内部のファイルごと、各ファイルのデータ行ごとに、いくつかの値を合計します。

更新2012-01-06

#ziplib(SharpZipLib)は、クラスを含むzipファイルに必要なことをすでに正確に実行していますZipInputStream。これは、すべてのファイルを特定のzipファイル内のシークできないストリームとして生成する例です。まだ7zソリューションを探しています。

IEnumerable<Stream> UnZipStream(Stream stream)
{
    using (var zipStream = new ZipInputStream(stream))
    {
        ZipEntry entry;
        while ((entry = zipStream.GetNextEntry()) != null)
            if (entry.IsFile)
                yield return zipStream;
    }
}
4

1 に答える 1

0

圧縮時に指定された基本的なアルゴリズムとパラメーターによって、使用されるチャンクのサイズが決まります。チャンクをデコードするときに、チャンクが単語/行の境界に収まるようにする方法はありません。そのため、処理する前にファイルを完全に解凍する必要があります。

あなたが求めていることは、おそらく一時ファイルなしでは不可能です-それが実際に依存するのは、解凍されたファイルをMemoryStreamを介して開いたままにし、すべての処理を実行してからメモリを解放してプールに戻すのに十分なメモリがあるかどうかです。これをさらに複雑にしているのは、これを繰り返し実行することで発生する可能性がある (プロセス メモリの) 断片化です。

于 2011-08-29T09:25:40.283 に答える