C# 128 GB Ram x64 cpu内存不足问题
我正在开发一个程序,它将312MB的加密文件读入内存流,解密并复制到目标流。我的程序运行良好,文件大小约为120MB。我不明白为什么它会失败 我的系统信息:64位cpu,RAM:128 GB 还有我使用Configuration Manager中的任何CPU设置构建的c#代码 我编写了一个示例程序来检查内存的不足之处,我发现内存不足512MB。我知道内存流需要内存中连续的块,因为RAM是碎片化的。但是这里的RAM非常大,我在多台机器上尝试了14GB、64GB和8GB的RAM 感谢您的帮助 我编写的用于测试内存不足大小的示例程序: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 感谢您的帮助 我编写
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-不要紧-几乎所有加密都是“运行长度编码”,这意味着它以块的形式进行加密,并且解密工作不需要访问完整文件,因此,只要在任何一个时间点都能在内存中保存至少一个加密块,就可以在流上工作