【发布时间】:2014-03-07 14:00:14
【问题描述】:
它的作用:对于每个 EncryptedBase64PictureFile,读取内容,解密 base64 字符串并创建一个图片框。
问题出在哪里:疯狂的内存使用!我猜每个循环后的一些数据没有被正确删除。例如,输入大约 100MB 的加密数据的 100 个循环,应该生成大约 100MB 的图像文件,使用大约 1.5GB 的内存!当我尝试解密更多数据时,大约 150MB,我得到 OutOfMemory 异常。 Visual Studio 的内存分析报告说,“string fileContent= reader.ReadToEnd();” line 负责 80% 的分配。
for each EncryptedBase64PictureFile {
Rijndael rijAlg = Rijndael.Create();
rijAlg.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
rijAlg.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
FileStream fsread = new FileStream(EncryptedBase64PictureFile, FileMode.Open, FileAccess.Read);
ICryptoTransform desdecrypt = rijAlg.CreateDecryptor();
CryptoStream cryptostreamDecr = new CryptoStream(fsread,desdecrypt, CryptoStreamMode.Read);
StreamReader reader = new StreamReader(cryptostreamDecr);
string fileContent= reader.ReadToEnd(); //this should be the memory eater
var ms = new MemoryStream(Convert.FromBase64String(fileContent));
PictureBox myPictureBox= new PictureBox();
myPictureBox.Image = Image.FromStream(ms);
ms.Close();
reader.Close();
cryptostreamDecr.Close();
fsread.Close();
}
所以问题是,有没有办法在每次循环后正确释放内存?或者是别的什么问题? 感谢每个想法!
编辑: 当然我尝试 dispose() 所有 4 个流,但结果是一样的......
ms.Dispose();
reader.Dispose();
cryptostreamDecr.Dispose();
fsread.Dispose();
编辑: 发现问题。它不是 dispose(),而是从流中创建图片。删除图片后,内存占用从 1.5GB 变为 20MB。
编辑: 图片 .jpg 格式大约 500kb,base64 加密格式大约 700kb。但我真的不知道,imagebox 对象有多大。
编辑: 100 个循环,输入大约 100MB 意味着每个循环大约需要 1MB,100MB 总共是 100 个循环
【问题讨论】:
-
你有多大的图片?
-
32 位?它可能只是碎片化。在 32 位内存空间中处理 100mb 块是 - 鲁莽的。这势必会产生问题(大对象堆框架)。
-
您是否测试过 X 数量的加密数据导致 X 数量的
PictureBox+Image实例的假设?也许这里有一个大于 1 的因素? (虽然 15 倍听起来确实太多了) -
如果图像是 .JPG 图像,那么 100MB 的 JPEG 是很多像素,因此我的原始问题。
-
为什么要显式调用
.Dispose()没有充分的理由,您真的应该更改代码以使用using语句。
标签: c# .net memory-management