我正在开发一个从串口读入的程序,然后适当地解析,格式化和显示信息。但是,该程序需要运行超过12个小时 - 不断处理传入数据流。我发现,当我让我的应用程序运行一段时间后,内存使用率会以线性速率增加 - 不适合12小时使用。
我已经实现了一个将原始传入二进制数据写入文件的记录器 - 有没有办法可以利用这个想法定期清理我的内存缓存?即我怎么能经常以这样的方式写入日志文件,使得数据不需要存储在内存中?
此外 - Windows窗体应用程序的其他方面是否有助于此?例如。我将格式化的字符串打印到文本框,最终显示整个字符串。因为它运行了这么长时间,它可以轻松显示数十万行文本。我应该将其写入文件并清除文本吗?或其他什么?
答案 0 :(得分:2)
显然,如果字符串随着时间的推移而增长,那么应用程序的内存使用量也会随着时间的推移而增长。此外,WinForms文本框可能无法处理非常大的字符串。字符串有多大?
除非你真的想在屏幕上显示整个字符串,否则你应该定期清除它(取决于用户的期望);这将节省内存并可能提高性能。
答案 1 :(得分:1)
通常,.NET中的内存管理是完全自动的。你应该小心将短暂的观察(分钟)推断到12小时。请注意,TaskManager不是衡量内存使用情况的好工具。
写入传入数据不应显着增加内存使用量。但是你应该避免做一些事情,并且反复连接到一个字符串就是其中之一。您的TextBox可能比您想象的要花费更多。使用ListBox会更有效率。而且更容易。
答案 2 :(得分:0)
我有几个串行应用程序,可以作为应用程序运行,也可以作为Windows服务运行。这些要求是24 / 7-365。我发现避免同样问题的最佳机制是双重的。
1)将信息写入日志文件。对于服务,这是获取信息的唯一方法。日志文件不会增加内存使用量。
2)对于应用程序,将信息写入日志文件并将其放入列表框中。我通常将列表框限制为最后500或1000个条目。使用较新的.net控件,列表框是虚拟化的,这有助于您也不会遇到其他内存问题,例如文本框连接。
您可以通过不断添加字符串数小时来使用文本框关闭系统,因为它不是用于开箱即用的那种滥用行为。