我有以下情況。如何最大限度地減少WPF Toolkit圖表的內存使用量?
有一條線圖可以一次顯示10行。每行包含355個數據點。用戶可以通過選擇/取消選擇包含數據序列的數據對象來打開和關閉每一行。
圖表線看起來像這樣:
<charting:LineSeries ItemsSource="{Binding DataSlot1, Mode=OneWay}"
IndependentValueBinding="{Binding X, Mode=OneWay}"
DependentValueBinding="{Binding Y, Mode=OneWay}"
DataPointStyle="{StaticResource styleForDataSlot1}"
IsSelectionEnabled="False" />
和我的數據從視圖模型加載到每10「的數據時隙」的如下。
數據點是結構:
public struct SimpleDataPoint
{
public double X { get; set; }
public double Y { get; set; }
}
視圖模型包含 「的數據時隙」:
private SimpleDataPoint[][] _dataSlots;
和視圖模型通過屬性暴露數據時隙:
public SimpleDataPoint[] DataSlot1
{
get { return _dataSlots[0]; }
}
當我將數據加載到插槽,我做這樣的事情:
_dataSlots[freeSlot] = myDataProvider.GetPoints();
從插槽我做清晰的數據:
_dataSlots[slotToClear] = null;
每個之後添加/刪除數據操作的插槽我打電話
OnPropertyChanged("DataSlot1");
問題: 如果用戶的作品很長一段時間,爲圖表添加和刪除數據行時,我的應用程序的內存使用量很快會增加到大約100兆字節。
要查找問題是否出現在我的代碼中,我註釋掉了OnPropertyChanged調用。內存沒有增加,當然圖表沒有顯示任何數據。
所以我認爲問題在於圖表沒有釋放內存。在我完成_dataSlots [slotToClear] = null並且圖表上相應的數據行消失後,內存不會釋放,並且在完全關閉圖表所在的WPF視圖後內存不會恢復正常。
我試着在每個dataSlots [slotToClear] = null之後調用System.GC.Collect(),但它沒有幫助。
如何強制WPF Toolkit圖表釋放不再顯示的數據序列的內存?
我會盡力重現這個問題,但我認爲你寧願使用ObservableCollection類。如果我的直覺是對的,我會說更多的信息做什麼。 – vorrtex 2011-04-09 18:04:23
ObservableCollection類稍微好一些,但內存泄漏仍然存在。所以我不知道還有什麼要做。 – vorrtex 2011-04-09 21:10:40
感謝您的想法,您對ObservableCollection有所瞭解。我想,問題是一些討厭的泄漏:http://connect.microsoft.com/VisualStudio/feedback/details/571956/wpf-toolkit-lineseries-has-memory-leak因此,也許我必須看看WPF工具包源代碼,看看我是否可以添加一些快速和骯髒的解決方法。或者,也許我將不得不尋找一些替代圖表庫... – JustAMartin 2011-04-10 08:18:23