2017-10-17 37 views
0

有没有办法告诉Windows为程序提供更多内存?我宁愿这样做,而不是重新编写一个简单的程序,否则它运行良好。我们可以为获取OutOfMemoryException的程序分配更多内存

我们有一个C#程序,每15分钟运行一次,并将新传入文件与前一个文件进行比较。新旧文件都是“|”分离并读入内存。我们还没有尝试优化,只是将所有内容都读入字典并进行直接比较。

我们收到此错误,

Message: Exception of type 'System.OutOfMemoryException' was thrown. at 
System.String.SplitInternal(Char[] separator, Int32 count, 
          StringSplitOptions options) 
at System.String.Split(Char[] separator) 

每个文件都有约1000线,每条线都有base64编码的大图像作为竖线分隔的领域之一。每行可以是500K-700K,因此每个文件的总大小约为600MB。也许偶尔会超过1MB。

我们估计该程序使用1.5GB左右的RAM。我想给它更多的RAM而不是试图优化代码。或者,如果整个程序运行内存不足,或者某个特定的巨大行可能会导致SplitInternal引发此异常,将会很好。

Windows Server 2012R2。

编辑:有问题的代码行只是“string [] data = info.Split('|');”在一个循环内。在发现这个异常之后,程序继续并处理很多其他行。

不反对重写它,但如果有更简单的方法,我想先尝试一下。我们确认它是用“Prefer 32 bit”复选框编译的,所以首先我们将尝试取消选中并查看会发生什么。毕竟,2GB现在在服务器上并不是很多...

+3

你有内存泄漏。添加更多的内存不是解决方案,而是检查你的应用程序代码中的哪个部分泄漏了它 – Rahul

+0

你应该真的将代码更改为内存中不需要1.5 GB字符串的代码。除了OOM之外,异常通常意味着与物理内存不同的东西,例如32位进程中的地址或碎片,或者...... – Console

+0

'或者,如果程序整体运行内存不足或一个特定的巨大行可能会导致SplitInternal抛出此异常.'另一个值得了解的好事可能是您正在运行的代码... – mjwills

回答

1

应用程序项目是否设置了“首选32位”?

What is the purpose of the "Prefer 32-bit" setting in Visual Studio 2012 and how does it actually work?

如果是这样,禁用它,你现在应该能够使用大多数可用的RAM,假设有其他地方没有问题。

+0

是的,这是设置。将尝试没有看到会发生什么。谢谢! – royappa

+0

我们的合作伙伴发现有时图像大小可达4MB,同时将图像大小减小到10K ..所以目前还不清楚这是否会奏效,但是,我们绝对想要使用64位来处理所有事情,所以这是最有用的答案。谢谢 - 每个人! – royappa

+0

@royappa你可能想看看这样的一些代码,如https://stackoverflow.com/a/6655492/310988,当你读取流时将流切分成多个字符串。这将节省您不得不阅读完整字符串,然后从该大字符串中创建较小的字符串。 – AndyJ