【发布时间】:2013-04-01 07:25:47
【问题描述】:
我正在实现一个读取 xml 文件、加密和压缩它们然后作为流发送到 Web 服务的系统 我的测试 xml 文件大小从 1KB 到 26MB 不同。 当我将代码作为单线程运行时,它似乎运行良好。 但是,当将我的代码更新为多线程时,在操作大文件时,它会在代码的不同部分抛出内存不足异常。
这是我的代码抛出异常的代码块:
1.
RijndaelManaged sessionKey = new RijndaelManaged();
sessionKey.KeySize = 256;
EncryptedXml eXml = new EncryptedXml();
byte[] encryptedElement = eXml.EncryptData(xmlDoc.DocumentElement, sessionKey, false);
2.
EncryptedXml.ReplaceElement(xmlDoc.DocumentElement, edElement, false);
3.
private static string CompressStream(string data)
{
byte[] byteData = System.Text.ASCIIEncoding.ASCII.GetBytes(data);
byte[] compressedData = QuickCompression.Compress(byteData, CompressionMethod.Deflated, CompressionLevel.Highest);
return Convert.ToBase64String(compressedData);
}
在第三部分,代码可以在任何一行抛出异常,但尤其是在第三行抛出异常
Convert.ToBase64String(compressedData);
同时,我在代码运行时通过任务管理器检查我的内存,似乎有很多可用内存可用!
我的假设是,即使总共有可用内存,也没有足够的可用内存来适应字节数组大小作为统一块。
你怎么看?
如果我的假设是正确的,那么
有没有办法强制内存合并可用内存块以获得大的可用块? 或者 有什么方法可以强制我的代码等到有足够的可用内存来适应字节数组大小作为统一块?
如果我的假设是错误的,那么 可能是什么问题?
谢谢
编辑
有一个类叫MemoryFailPoint,它能帮我解决我的问题吗?
【问题讨论】:
-
如果您的代码在使用多线程时失败,嗯……这可能意味着您遇到了多线程问题,而不是内存问题。检查您的代码是否存在同步问题(包括像 QuickCompression 这样的 3d 派对),尝试添加锁等。
-
尝试分析您的内存使用情况(但不要使用任务管理器)。这将帮助您确定内存是否是问题所在,而不是进行猜测。正如 Simon 建议的那样,您可能遇到了多线程问题。
-
您的多线程代码是否调用
CompressStream()?如果是这样,那么通过使该方法成为单线程的(例如,通过使用lock保护它)您可能能够解决问题。 -
我通过添加锁重新运行我的代码,现在看起来好多了,在我添加锁之前,我遇到了 10 个文件的异常。但现在我得到了 3 个文件的例外,它们是前 3 个最大的文件
-
我再次更新了我的代码。之前我锁定了加密和压缩的功能块,现在,我在加密之前加了一个锁,在加密完成后释放锁,然后我在压缩完成后添加了一个锁压缩块和释放锁。结果最惨!!所以再次,我认为这真的是内存块问题!
标签: c# encryption compression