[英]How to solve System.OutOfMemoryException in C#?
My code is 我的代码是
private byte[] Invoke(Stream inputFileStream, CryptoAction action)
{
var msData = new MemoryStream();
CryptoStream cs = null;
try
{
long inputFileLength = inputFileStream.Length;
var byteBuffer = new byte[4096];
long bytesProcessed = 0;
int bytesInCurrentBlock = 0;
var csRijndael = new RijndaelManaged();
switch (action)
{
case CryptoAction.Encrypt:
cs = new CryptoStream(msData, csRijndael.CreateEncryptor(this.Key, this.IV), CryptoStreamMode.Write);
break;
case CryptoAction.Decrypt:
cs = new CryptoStream(msData, csRijndael.CreateDecryptor(this.Key, this.IV), CryptoStreamMode.Write);
break;
}
while (bytesProcessed < inputFileLength)
{
bytesInCurrentBlock = inputFileStream.Read(byteBuffer, 0, 4096);
cs.Write(byteBuffer, 0, bytesInCurrentBlock);
bytesProcessed += bytesInCurrentBlock;
}
cs.FlushFinalBlock();
return msData.ToArray();
}
catch
{
return null;
}
}
In case of encrypting large files of size 60mb System.OutOfMemoryException is thrown and program crashes.My operating system is 64bit and have 8Gb of ram. 如果要加密大小为60mb的大文件,则会引发System.OutOfMemoryException并导致程序崩溃。我的操作系统是64位,内存为8Gb。
Try to get rid of all that buffer management code, that could be the cause of your problems... try to work with two streams (MemoryStream for volatile output is good): 尝试摆脱所有可能导致问题的缓冲区管理代码...尝试使用两个流(对于易失性输出而言,MemoryStream很好):
using (FileStream streamInput = new FileStream(fileInput, FileMode.Open, FileAccess.Read))
{
using (FileStream streamOutput = new FileStream(fileOutput, FileMode.OpenOrCreate, FileAccess.Write))
{
CryptoStream streamCrypto = null;
RijndaelManaged rijndael = new RijndaelManaged();
cspRijndael.BlockSize = 256;
switch (CryptoAction)
{
case CryptoAction.ActionEncrypt:
streamCrypto = new CryptoStream(streamOutput, rijndael.CreateEncryptor(this.Key, this.IV), CryptoStreamMode.Write);
break;
case CryptoAction.ActionDecrypt:
streamCrypto = new CryptoStream(streamOutput, rijndael.CreateDecryptor(this.Key, this.IV), CryptoStreamMode.Write);
break;
}
streamInput.CopyTo(streamCrypto);
streamCrypto.Close();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.