1

标题并没有使我的要求变得那么明显,但是我创建了一种算法,可以将一堆文件压缩成一个文件,然后再次解压缩它们。为了避免 OutOfMemory 异常,我使用了两个 fileStreams,首先从原始文件中读取数据段,然后另一个 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 回答