1

タイトルだけでは何を求めているのかわかりませんが、多数のファイルを 1 つのファイルに圧縮し、再度解凍するアルゴリズムを作成しました。OutOfMemory 例外を回避するために、2 つの fileStream を使用して、最初に元のファイルからデータのセグメントを読み取り、次に他の fileStream を使用してこれらのセグメントを最終的なファイルに書き込みます。

以下にコードの抜粋を含めました。この場合、rStream と wStream はすでに適切に宣言されており、bufferSize は現在 16 mB です。fInfo は、読み取り元のファイルのファイル情報です。

明らかに、bufferSize が大きいほど、操作は速く完了します。操作の効率を最大化するために使用できる最大 bufferSize を知りたいですか?

                int bytesRead = 0;
                long toRead = fInfo.Length - curFileSize;
                if (toRead > bufferSize) { toRead = bufferSize; }
                byte[] fileSegment = new byte[toRead];

                while (bytesRead < toRead)
                {
                    bytesRead += rStream.Read(fileSegment, bytesRead, (int)toRead - bytesRead);
                }

                wStream.Seek(finalFileSize, SeekOrigin.Begin);
                wStream.Write(fileSegment, 0, (int)toRead);
4

2 に答える 2

0

データの量は、さまざまな要因によって異なります。小さいチャンクを使用する場合、圧縮アルゴリズムは最初のチャンクが入るまで待つ必要がないため、小さいファイルサイズの圧縮が向上します。チャンクが大きいほどメモリを消費しますが、読み取り操作が少なくなり、パフォーマンスが向上します。この場合、ファイルが16MBより小さい場合、読み取りは圧縮を開始するのと同じでReadToEnd()あり、圧縮を開始しません。

于 2012-10-03T22:48:01.697 に答える
0

16 MB のバッファーは明らかに過剰に思えます。通常、そのようなバッファには数キロバイトが使用されます。16 MB では、バッファーを大きくしてもほとんど効果がないか、まったく効果がありません。

大きなバッファを使用している場合は、プロセッサ キャッシュに収まらず、アクセスが遅くなることを考慮してください。非常に大きくすると、その一部がディスクにスワップアウトされる可能性があるため、その時点でバッファーを大きくすると、速度が低下するだけです。

于 2012-10-03T23:01:03.807 に答える