2012-10-03 97 views
1

标题并没有说明我在问什么,但我创建了一个算法,将一堆文件压缩成单个文件,然后再解压缩它们。为避免OutOfMemory异常,我使用两个fileStreams,首先从原始文件中读取数据段,然后使用另一个fileStream将这些段写入最终文件。C# - 我应该一次从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); 
+0

“显然,bufferSize越高,操作完成的速度越快”+“我最大可能使用的bufferSize的最大值是多少”==最大可用内存 – zerkms

+0

您有多少内存? – peacemaker

+2

16毫比特?我认为你的意思是MB而不是mB ...;) – Guffa

回答

0

16 MB的缓冲区肯定听起来像是过度杀伤。通常几千字节用于这样的缓冲区。在16 MB时,缓冲区变大,或者根本没有增益。

请注意,如果您使用的是较大的缓冲区,则它不适合处理器缓存,访问速度会较慢。如果你使它变得非常大,它的某些部分甚至可能会被换出到磁盘上,所以在这一点上使缓冲区变大只会使它变慢。

0

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

相关问题