C# - 我应该一次从FileStream中读取多少字节?

时间:2012-10-03 22:42:44

标签: c# arrays byte filestream max

标题并没有让我明白我的要求,但我创建了一个算法,将一堆文件压缩成一个文件,然后再次解压缩。为了避免OutOfMemory Exceptions,我使用两个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);

2 个答案:

答案 0 :(得分:0)

数据量取决于多种因素。如果使用较小的块,则压缩算法不必等待第一个块进入的时间长,从而提高了较低文件大小的压缩率。较大的块占用更多内存,但会导致更少的读取操作,从而提高性能。如果您的文件在这种情况下小于16MB,则您的读取与ReadToEnd()没有区别,并且不会让压缩开始。

答案 1 :(得分:0)

16 MB的缓冲区听起来有点矫枉过正。通常几千字节用于这样的缓冲区。在16 MB时,你可以很大程度上减少缓冲区,或者根本没有。

考虑一下,如果您使用的是大缓冲区,它将无法容纳在处理器缓存中,并且访问速度会变慢。如果你把它变得非常大,它的某些部分甚至可能被换成磁盘,所以在这一点上使缓冲区更大只会使它更慢。