标题并没有让我明白我的要求,但我创建了一个算法,将一堆文件压缩成一个文件,然后再次解压缩。为了避免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);
答案 0 :(得分:0)
数据量取决于多种因素。如果使用较小的块,则压缩算法不必等待第一个块进入的时间长,从而提高了较低文件大小的压缩率。较大的块占用更多内存,但会导致更少的读取操作,从而提高性能。如果您的文件在这种情况下小于16MB,则您的读取与ReadToEnd()
没有区别,并且不会让压缩开始。
答案 1 :(得分:0)
16 MB的缓冲区听起来有点矫枉过正。通常几千字节用于这样的缓冲区。在16 MB时,你可以很大程度上减少缓冲区,或者根本没有。
考虑一下,如果您使用的是大缓冲区,它将无法容纳在处理器缓存中,并且访问速度会变慢。如果你把它变得非常大,它的某些部分甚至可能被换成磁盘,所以在这一点上使缓冲区更大只会使它更慢。