Как минимизировать использование памяти для диаграмм WPF Toolkit? - PullRequest
1 голос
/ 09 апреля 2011

У меня следующая ситуация.

Существует одна линейная диаграмма, которая может отображать 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 «слотов данных» из ViewModel следующим образом.

Точки данных являются структурами:

public struct SimpleDataPoint
{
    public double X { get; set; }
    public double Y { get; set; }
}

ViewModel содержит «слоты данных»:

   private SimpleDataPoint[][] _dataSlots;

и ViewModel предоставляетданные слоты через свойства:

   public SimpleDataPoint[] DataSlot1
   {
       get { return _dataSlots[0]; }
   }

когда я загружаю данные в слот, я делаю что-то вроде этого:

    _dataSlots[freeSlot] = myDataProvider.GetPoints();

, чтобы очистить данные из слота, который я делаю:

    _dataSlots[slotToClear] = null;

После каждой операции добавления / удаления данных для слота я вызываю

    OnPropertyChanged("DataSlot1"); 

Проблема: , если пользователь долго работает, добавляя и удаляя строки данных дляДиаграмма, использование памяти для моего приложения скоро достигает около 100 мегабайт.

Чтобы выяснить, не связана ли проблема с моим кодом, я прокомментировал вызовы OnPropertyChanged.Память не выросла и, конечно, на графике не отображались никакие данные.

Итак, я предполагаю, что проблема в том, что диаграмма не освобождает память.Память не освобождается после того, как я выполню _dataSlots [slotToClear] = null и соответствующая строка данных на диаграмме исчезнет, ​​а также память не вернется к нормальному состоянию после того, как я полностью закрою представление WPF, где находится диаграмма.

Я пытался даже вызывать System.GC.Collect () после каждого dataSlots [slotToClear] = null, но это не помогает.

Как заставить диаграмму WPF Toolkit освободить память для рядов данныхкоторые больше не отображаются?

1 Ответ

1 голос
/ 10 апреля 2011

В моем примере у меня есть 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 элемент управления.

После запуска приложение потребляет 26 МБ памяти. Первое обновление - 32Мб. Второе обновление - 35Мб.

Но в следующих обновлениях это значение не превысит, это максимум.

С 3650 точками (в 10 раз больше) цифры: 52 -> 68 -> 88.

Я не знаю, что произойдет, если использовать 10 строк, но потребление памяти должно быть ниже 100 МБ.

...