2014-02-27 43 views
2

我正在使用ObservableCollection将信息存储在我的CPU使用情况并将此信息传输到折线图。信息每秒更新一次。它工作正常,但我意识到这将会加重我的记忆,因为它只是不断地向列表添加信息。如何管理我的内存问题

这种情况下的常态是什么?你是否在每分钟后重置列表?我觉得这会弄乱图表每次重置时图表的样子。请建议如何快速处理这个记忆问题。谢谢。

ObservableCollection<KeyValuePair<double, double>> chart1 = new ObservableCollection<KeyValuePair<double, double>>(); 


chart1.Add(new KeyValuePair<double, double>(DateTime.now, getCurrentCpuUsage())); 

回答

3

你应该做什么取决于你的要求。

如果您只需要保留一定数量的数据(例如10分钟或其他),则有界队列可能比ObservableCollection更合适。这样,“太旧”的事件会自动脱离数据结构,允许您限制内存使用量。

如果您仍然希望能够在未来访问旧数据,您可以将从队列尾部出来的数据写入文件或数据库,而不是将其丢弃。

对于一个实现一个有界队列看到

Limit size of Queue<T> in .NET?

因为你可能需要一个观察的有界队列,下面是关于如何实现一个(非常简单)

Observable Stack and Queue

一些注意事项

有界队列解释

一个普通的队列就像在收银台上的线。人员排队(或者如英国人所说的排队),收银员把人员排在队伍的最前面。先进先出。 FIFO。

有界队列设置线的最大长度。对于一条真实的线路,如果太长,新人将被阻止加入线路。软件中的一些有限队列也是如此。保持队列长度不超过限制的另一个选项是在线路太长时从队列的前面移除。在现实生活中,这可能不是很公平,但对于软件算法来说,这有时候正是你需要的。

+0

我环顾四周,确实遇到了一个有界的队列,但有点令人困惑。试图通过你的链接把握这个想法。 – kar

+0

增加了一些解释来帮助你理解有界队列的概念。 –

0

存储尽可能多的信息,然后放下(或保存到文件)其余部分。

如果您需要存储很长时间跨度(超过1M数据点)的数据,您可以尝试压缩数据。但首先要弄清楚你的目标并衡量性能时间/内存使用情况。

+0

在任何时候,我只希望存储1分钟的信息。我每秒存储信息,因此有60套信息。 – kar