首页 > 解决方案 > 数据查看器应用程序 C# 的内存问题

问题描述

我的应用程序是一个数据查看器,因此它由行和列以及单个单元格组成(想想 Excel)。

让我稍微描述一下我的数据结构。数据集是列的集合。每列都有一组单元格。每个单元格都绑定了一个 VariableContent 类,您可以在下面看到。

object _content;
/// <summary>
/// Gets or sets the content of the cell
/// </summary>
public object Content {
    get {
        return (_content);
    }
    set {
        _content = value;
        OnPropertyChanged(nameof(Content));
    }
}

ObservableCollection<Comment> _comments;
public ObservableCollection<Comment> Comments
{
    get
    {
        return (_comments);
    }
    set
    {
        _comments = value;
        OnPropertyChanged(nameof(Comments));
    }
}

Color _color = Brushes.Transparent.Color;
public Color Color
{
     get { return _color; }
    set
    {
        _color = value;
        OnPropertyChanged(nameof(Color));
    }
}


public VariableContent(object Content, ObservableCollection<VariableComment> Comments, Color Color)
{
    PropertyChanged = null;
    this.Content = Content;
    this.Comments = Comments;
    this.Color = Color;
}

因此,对于每个单元格,我们可能会存储一个评论列表和一种颜色。Comments 和 Color 属性是新的,因为我们最近添加了一个能够为单元格着色以及向单元格添加评论的功能。

但是,我发现对于大型数据集(例如数十万行),由于有很多单元格,因此初始化了这个 VariableContent 类的许多实例,内存使用量增加了大约三分之一,这太多了,与更新之前相比,我们在此类中没有 Color 和 Comments 属性。另一个副作用是数据集的加载时间也增加了三分之一。

将属性值设置为 null 没有区别,只有从类中删除属性才会再次降低内存占用。我还能做些什么来帮助这个吗?

标签: c#.netwpf

解决方案


如果您使用大数据,那么您需要使用分页。在对数据进行分页时,页面中显示的精确记录取决于所请求的数据页和每页显示的记录数。内存使用量不会增加,数据集加载时间会更快。将大数据加载到 ObservableCollection 并不是一个好的解决方案


推荐阅读