我使用ObservableCollection来存储有关CPU使用率的信息并将此信息传输到折线图。信息每秒更新一次。它工作正常,但我意识到这会让我的记忆超时,因为它只是不断向列表中添加信息。
这种情况的常态是什么?你每分钟后重置一次列表吗?我觉得这会弄乱图表每次重置时的样子。请建议我如何迅速管理这个记忆问题。谢谢。
ObservableCollection<KeyValuePair<double, double>> chart1 = new ObservableCollection<KeyValuePair<double, double>>();
chart1.Add(new KeyValuePair<double, double>(DateTime.now, getCurrentCpuUsage()));
答案 0 :(得分:3)
你应该做什么取决于你的要求。
如果您只需要保留一定数量的数据(例如10分钟或其他),则有界队列可能比ObservableCollection更合适。这样,“太旧”的事件会自动脱离数据结构,从而可以限制内存使用量。
如果您仍希望将来能够访问旧数据,您可以将队列末尾的数据写入文件或数据库,而不是仅删除它。
对于有界队列的一个实现,请参阅
Limit size of Queue<T> in .NET?
由于您可能需要一个可观察的有界队列,这里有一些关于如何实现一个的说明(相当简单)
有界队列解释
常规队列就像结账台上的线路一样。人们在排队的最后排队(或者英国人会说排队),收银员将人排在前线。先进先出。 FIFO。
有界队列设置该行的最大长度。对于现实生活中的线路,如果太长,新人将无法加入线路。软件中的一些有限队列也是如此。保持队列长度不超过限制的另一个选项是当行太长时从队列的前面删除。在现实生活中,这可能不太公平,但对于软件算法而言,有时候只是你需要的。
答案 1 :(得分:0)
根据需要存储尽可能多的信息,然后删除(或保存到文件)其余信息。
如果您需要存储非常长时间跨度的数据(超过1M的数据点),您可以尝试压缩数据。但要先弄清楚你的目标并测量性能时间/内存使用情况。