2014-01-06 19 views
0

我想将文件读入流中作为base64string,我使用下面的代码来读取文件,但是当我看到内存使用量超过900MB时,我监视它时通过任务管理器。我错过了什么,我可以看到,当我将它读入字符串时,内存使用情况开始上升(我使用了150 MB文件来测试它)。使用太多内存读取文件流

stringBuilder Sb= new stringBuilder(); 
using (var fs = new FileStream(@"C:\Users\Sanath Kumar\Desktop\s.pdf", FileMode.Open, FileAccess.Read)) 
{ 
    var buffer = new byte[fs.Length]; 
    fs.Read(buffer, 0, (int)fs.Length); 
    Sb.Append(Convert.ToBase64String(buffer)); 
    buffer = null; 
    fs.Flush(); 
    fs.Dispose(); 
} 

回答

5

这里的问题是您正在将文件全部读入内存并复制数据。

  • byte[]阵列
  • 具有char[]背衬阵列

如果该文件是一个显著大小的这必定会在内存中引起尖峰的StringBuilder

而不是一次全部读取,而是尝试使用ToBase64Transform类。这被设计为与Stream一起作为输入,并且将避免一次将整个文件加载到内存中。相反,它会以块处理它。

+0

hey JaredPar, 我已经使用链接中的代码,http://msdn.microsoft.com/en-us/library/system.security.cryptography.tobase64transform(v=vs.110).aspx和而不是写入outfile,我附加到一个字符串,但它永久代码执行 –

+0

,因为我想要一次完整的base64Encoded字符串数据在内存中,上述解决方案似乎并不适用于我,是任何其他选择 –