2011-04-09 58 views
1

我有以下情況。如何最大限度地減少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圖表釋放不再顯示的數據序列的內存?

+0

我會盡力重現這個問題,但我認爲你寧願使用ObservableCollection類。如果我的直覺是對的,我會說更多的信息做什麼。 – vorrtex 2011-04-09 18:04:23

+1

ObservableCollection類稍微好一些,但內存泄漏仍然存在。所以我不知道還有什麼要做。 – vorrtex 2011-04-09 21:10:40

+0

感謝您的想法,您對ObservableCollection有所瞭解。我想,問題是一些討厭的泄漏:http://connect.microsoft.com/VisualStudio/feedback/details/571956/wpf-toolkit-lineseries-has-memory-leak因此,也許我必須看看WPF工具包源代碼,看看我是否可以添加一些快速和骯髒的解決方法。或者,也許我將不得不尋找一些替代圖表庫... – JustAMartin 2011-04-10 08:18:23

回答

1

在我的例子中,我有1個365點的圖表。該圖表在其自己的用戶控制ChartView中定義。主窗口看起來如此:

<Grid x:Name="root"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 
    <StackPanel Orientation="Horizontal"> 
     <Button x:Name="update" Content="Update first" Click="update_Click"/> 
    </StackPanel> 
    <local:ChartView Grid.Row="1" /> 
</Grid> 

按鈕的事件處理程序:

private void update_Click(object sender, RoutedEventArgs e) 
    { 
     this.root.Children.RemoveAt(1); 
     GC.Collect(); 

     this.model._dataSlots[0] = myDataProvider.GetPoints(); //this.DataContext = this.model 

     var v = new ChartView(); 
     Grid.SetRow(v, 1); 
     this.root.Children.Insert(1, v); 
    } 

的順序如下:

  1. 取下視覺樹ChartView控制。
  2. 調用垃圾收集器。
  3. 更新視圖模型。
  4. 插入新的ChartView控件。

啓動後應用程序消耗26Mb的內存。 第一次更新 - 32Mb。 第二次更新 - 35Mb。

但是下次更新不會超過此值,這是最大值。

隨着3650點(10倍以上)的數字是:52 - > 68 - > 88

我不知道會發生什麼,如果用10行,但內存消耗必須成爲任何低於100MB。

+0

謝謝,剛試過你的解決方案,它似乎足夠好,我會堅持下去,如果我找不到其他免費的圖表圖書館。 – JustAMartin 2011-04-10 14:46:25

相關問題