2

我正在实现一个读取 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的类,它可以帮助我解决我的问题吗?

4

1 回答 1

0

估计是new string里面Convert.ToBase64String

我可能有类似的问题。简单地分配巨大的内存块并new string抛出内存异常。在我的盒子(8 GB 主内存)上,170 MB 及以上。

于 2013-12-10T16:21:26.183 回答