【发布时间】:2018-03-29 02:26:54
【问题描述】:
有没有办法告诉 Windows 给程序更多内存?我宁愿这样做,也不愿重新编写一个运行良好的简单程序。
我们有一个 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。我只想给它更多的内存,而不是尝试优化代码。或者,最好知道整个程序是否内存不足,或者某个特定的大行可能导致 SplitInternal 抛出此异常。
Windows Server 2012R2。
编辑:有问题的代码行只是“string[] data = info.Split('|');”循环内。捕获此异常后,程序继续执行并处理许多其他行就好了。
不反对重写它,但如果有更简单的方法,我想先尝试一下。我们确认它是使用“首选 32 位”复选框编译的,所以首先我们将尝试取消选中它,看看会发生什么。毕竟,如今在服务器上,2GB 并不是很多...
【问题讨论】:
-
那里有内存泄漏。添加更多 RAM 不是解决方案,而是检查您的应用程序代码中的哪个位置泄漏它
-
您应该真正将代码更改为不需要内存中 1.5 GB 字符串的内容。除了 OOM Exception 之外,通常意味着与实际内存不足不同的东西,例如 32 位进程中的地址,或碎片,或....
-
Alternatively it would be nice to know if the program as a whole is running out of memory or one particular huge line may cause SplitInternal to throw this exception.另一个好消息可能是您正在运行的代码... -
分配大字符串的问题是它们需要连续的内存片。因此,即使您有 2 Gb 的可用内存,如果可用内存碎片化,您也可能会遇到 OutOfMemoryException。
-
您需要在问题中显示导致异常的代码。
标签: c#