【问题标题】:Out of Memory issue on a 128 GB Ram x64 cpu128 GB Ram x64 cpu 上的内存不足问题
【发布时间】: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


【解决方案1】:

我猜大对象堆快用完了。然而,解决您的问题的另一种方法是不将流读入内存 - 大多数解密算法只需要 System.IO.Stream - 将其读入内存似乎是一个相对没有意义的步骤 - 只需将解密 api 传递给您的传入文件或网络流.

【讨论】:

  • 好吧,我正在研究一个始终加密的模型。我不希望未加密的文件落在磁盘上的任何位置。
  • 您不需要 - 只需将输入流传递给解密器,解密器几乎肯定会将您传回包含解密的 System.IO.Stream - 然后您可以在任何基于流的活动中使用它;您不需要在 MemoryStream 中全部使用它 - 可能任何旧流都可以。进行基于流的活动的一种好方法是嵌套流,而不是从一个流读取到另一个流。
  • 赞成这个答案,因为菲利普是对的。我不知道为什么有人反对这个。直接流式传输到文件或其他位置总是比将所有内容存储在内存中更好。
  • 顺便我用的是pgp加密
  • @HadoopAddict - 没关系 - 几乎所有加密都是“运行长度编码”,这意味着它以块为单位进行加密,您永远不需要访问完整文件才能进行解密,因此它只要您可以随时在内存中保存至少一个加密块,就乐于处理流。
【解决方案2】:

尝试在“构建”选项卡中禁用项目属性中的“首选 32 位”选项,这对我有用。 祝你好运!

【讨论】:

  • 还是一样,内存不足 512 MB
猜你喜欢
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 2013-08-07
  • 2015-04-15
  • 2019-11-01
相关资源
最近更新 更多