【发布时间】:2016-10-10 11:18:52
【问题描述】:
我正在开发一个程序,它将 312 MB 加密文件读入内存流,解密并复制到目标流中。我的程序适用于大约 120 MB 的文件大小。我不明白为什么它会失败?
我的系统信息:64 位 cpu,内存:128 GB 还有我使用配置管理器中的任何 CPU 设置构建的 c# 代码。
我编写了一个示例程序来检查内存不足的地方,我发现它在 512 MB 时失败了。我确实知道内存流需要内存中的连续块,因为 RAM 是碎片化的。但是这里的 RAM 很大,我在多台机器上也试过,RAM 分别为 14 GB、64GB 和 8GB。
感谢任何帮助。
我编写的用于测试 Out of Memory Size 的示例程序:
const int bufferSize = 4096;
byte[] buffer = new byte[bufferSize];
int fileSize = 1000 * 1024 * 1024;
int total = 0;
try
{
using (MemoryStream memory = new MemoryStream())
{
while (total < fileSize)
{
memory.Write(buffer, 0, bufferSize);
total += bufferSize;
}
}
Console.WriteLine("No errors");
}
catch (OutOfMemoryException)
{
Console.WriteLine("OutOfMemory around size : " + (total / (1024m * 1024.0m)) + "MB");
}
【问题讨论】:
-
你必须明确说你想在x64模式下编译,否则默认使用x86(参见“prefer 32-bit”选项)
-
我也这样做了。明确将平台设置为 x64
-
如果您将适当的
capacity值传递给MemoryStream的构造函数会怎样。这有帮助吗?例如,尝试new MemoryStream(fileSize)。您可能会遇到 LOH 压缩问题... -
也可以看到这个帖子:stackoverflow.com/questions/15595061/…
-
.NET 程序员因更改错误设置而臭名昭著。不要不要更改解决方案平台,对于 .NET 项目,它应该始终是 AnyCPU。右键单击您的 EXE 项目 > 属性 > 构建选项卡。取消勾选首选 32 位并确保目标平台设置为 AnyCPU。重复发布配置。
标签: c# memory memory-management out-of-memory