C# 128 GB Ram x64 cpu内存不足问题

C# 128 GB Ram x64 cpu内存不足问题,c#,memory,memory-management,out-of-memory,C#,Memory,Memory Management,Out Of Memory,我正在开发一个程序,它将312MB的加密文件读入内存流,解密并复制到目标流。我的程序运行良好,文件大小约为120MB。我不明白为什么它会失败 我的系统信息:64位cpu,RAM:128 GB 还有我使用Configuration Manager中的任何CPU设置构建的c#代码 我编写了一个示例程序来检查内存的不足之处,我发现内存不足512MB。我知道内存流需要内存中连续的块,因为RAM是碎片化的。但是这里的RAM非常大,我在多台机器上尝试了14GB、64GB和8GB的RAM 感谢您的帮助 我编写

我正在开发一个程序,它将312MB的加密文件读入内存流,解密并复制到目标流。我的程序运行良好,文件大小约为120MB。我不明白为什么它会失败

我的系统信息:64位cpu,RAM:128 GB 还有我使用Configuration Manager中的任何CPU设置构建的c#代码

我编写了一个示例程序来检查内存的不足之处,我发现内存不足512MB。我知道内存流需要内存中连续的块,因为RAM是碎片化的。但是这里的RAM非常大,我在多台机器上尝试了14GB、64GB和8GB的RAM

感谢您的帮助

我编写的用于测试内存不足大小的示例程序:

 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");
            }
const int bufferSize=4096;
字节[]缓冲区=新字节[bufferSize];
int fileSize=1000*1024*1024;
int-total=0;
尝试
{
使用(MemoryStream memory=new MemoryStream())
{
while(总数<文件大小)
{
写入(缓冲区,0,缓冲区大小);
总+=缓冲区大小;
}
}
Console.WriteLine(“无错误”);
}
捕获(OutOfMemoryException)
{
WriteLine(“大约大小的OutOfMemory:+(总计/(1024m*1024.0m))+“MB”);
}

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

我猜,只是耗尽了大型对象堆。但是,解决问题的另一种方法是不将流读入内存-大多数解密算法只需要System.IO.stream-将其读入内存似乎是一个相对无意义的步骤-只需将解密api传递给传入文件或网络流即可。

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

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

祝你好运

您必须明确表示希望在x64模式下编译,否则x86将用作默认值(请参阅“首选32位”选项),我也这样做了。明确地将平台设置为x64,如果您将适当的
容量
值传递给
内存流
的构造函数,该怎么办。这有用吗?例如,尝试
newmemoryStream(fileSize)
。您可能会遇到LOH压缩问题…请参阅此帖子:。众所周知,网络程序员更改了错误的设置。不要更改解决方案平台,它应该始终是.NET项目的AnyCPU。右键单击EXE项目>属性>生成选项卡。取消勾选32位并确保目标平台设置为AnyCPU。对发行版配置重复上述步骤。您必须明确表示希望在x64模式下编译,否则默认使用x86(请参阅“首选32位”选项),我也这样做了。明确地将平台设置为x64,如果您将适当的
容量
值传递给
内存流
的构造函数,该怎么办。这有用吗?例如,尝试
newmemoryStream(fileSize)
。您可能会遇到LOH压缩问题…请参阅此帖子:。众所周知,网络程序员更改了错误的设置。不要更改解决方案平台,它应该始终是.NET项目的AnyCPU。右键单击EXE项目>属性>生成选项卡。取消勾选32位并确保目标平台设置为AnyCPU。对发行版配置重复上述步骤。好吧,我正在处理一个始终加密的模型。我不希望未加密的文件被放在磁盘上的任何地方。你不需要-只需将你的输入流传递到解密程序,它几乎肯定会将包含解密的System.IO.stream传递给你-然后你就可以在任何基于流的活动中使用它;你不需要把所有的东西都放在一个内存流中——也许任何旧的流都可以。做基于流的活动的一个好方法是嵌套流,而不是从一个流读到另一个流。我不知道为什么有人否决了这个。最好是直接流式传输到文件或其他地方,然后将所有内容存储在内存中way@HadoopAddict-不要紧-几乎所有加密都是“运行长度编码”,这意味着它以块的形式进行加密,并且解密工作不需要访问完整文件,因此,只要您在任何时候都可以在内存中保存至少一个加密块,就可以在流上工作。我不希望未加密的文件被放在磁盘上的任何地方。你不需要-只需将你的输入流传递到解密程序,它几乎肯定会将包含解密的System.IO.stream传递给你-然后你就可以在任何基于流的活动中使用它;你不需要把所有的东西都放在一个内存流中——也许任何旧的流都可以。做基于流的活动的一个好方法是嵌套流,而不是从一个流读到另一个流。我不知道为什么有人否决了这个。最好是直接流式传输到文件或其他地方,然后将所有内容存储在内存中way@HadoopAddict-不要紧-几乎所有加密都是“运行长度编码”,这意味着它以块的形式进行加密,并且解密工作不需要访问完整文件,因此,只要在任何一个时间点都能在内存中保存至少一个加密块,就可以在流上工作