【问题标题】:System.OutOfMemoryException while load data from datatable which have more than 2million rows to datagridSystem.OutOfMemoryException 将数据从超过 200 万行的数据表加载到数据网格
【发布时间】:2018-12-20 04:50:28
【问题描述】:

我正在尝试将 DataTable 分配为 dataGrid1 dataGrid1.ItemsSource = dtselect.DefaultView 的 itemsource 但它给出 System.OutOfMemoryException

我有一个包含多个 DataTable 的数据集。我在该按钮上随机创建一个按钮单击我想将数据从 DataTable 显示到 dataGrid1 但这里的问题是 DataTable 有超过 200 万行,当我单击一个按钮时,它需要超过 2gb 的内存并给我 System. OutOfMemoryException。

Button = sender as Button;
                    string content = button.Content.ToString();
                    foreach (DataTable table in dsr.Tables)
                    {
                        if (table.TableName == content)
                        {
                            dataGrid1.ItemsSource = table.DefaultView;
                            dtselect = table;
                        }
                    }

我希望输出更少的内存使用和显示结果而不是 System.OutOfMemoryException

【问题讨论】:

  • 您尝试将这么多数据加载到 DataTable 中是有原因的吗?
  • 显然,您不能在 UI 中显示 2M 行。无论如何,这有什么意义?你认为一个人可以处理 2M 行?没有。重新思考你在做什么。
  • 我想在 datagrid 上显示数据以应用过滤器
  • 一次读取大量数据集的基本架构是错误的。不要将整个数据库读入内存。不要显示数据然后应用过滤器。应用过滤器,读取数据并显示。如果合理的用户行为将返回超过 200 行,则使用 linq skip and take 对数据进行分页。

标签: c# wpf


【解决方案1】:
<Viewbox Grid.Row="3" Stretch="Fill">
                <DataGrid x:Name="dataGrid1" Grid.Row="3" VirtualizingPanel.VirtualizationMode="Recycling" BorderThickness="0" VirtualizingPanel.IsVirtualizing="True" CanUserSortColumns="True" EnableRowVirtualization="True" IsReadOnly="True" CanUserResizeColumns="True" CanUserAddRows="False"  VerticalAlignment="Bottom"  HorizontalAlignment="Stretch" VerticalScrollBarVisibility="Auto" 
                HorizontalScrollBarVisibility="Auto" ScrollViewer.CanContentScroll="True" Height="600" Width="auto" ItemsSource="{Binding}" AutoGenerateColumns="False" ScrollViewer.VerticalScrollBarVisibility="Auto"   Background="#b5d2fc"  ClipboardCopyMode="IncludeHeader" SelectionMode="Extended" CanUserDeleteRows="False">
                    <DataGrid.Columns>
                        <DataGridTextColumn Width="200" Header="Day"  Binding="{Binding Day}"/>
                        <DataGridTextColumn Width="200" Header="Date" Binding="{Binding Date}"/>
                        <DataGridTextColumn Width="200" Header="Time" Binding="{Binding Time}"/>
                        <DataGridTextColumn Width="200" Header="Lat" Binding="{Binding Lat}"/>
                        <DataGridTextColumn Width="200" Header="Long" Binding="{Binding Long}"/>
                        <DataGridTextColumn Width="400" Header="Address" Binding="{Binding Address}"/>
                        <DataGridTextColumn Width="200" Header="Accuracy" Binding="{Binding Accuracy}"/>
                        <DataGridTextColumn Width="200" Header="Type" Binding="{Binding Type}"/>
                    </DataGrid.Columns>
                </DataGrid>
                </Viewbox>

我只需添加 Viewbox,如果我加载两个以上具有大量数据的文件,我的代码就可以正常工作,那么它消耗的内存也更少

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 2019-06-30
    • 2012-06-16
    • 1970-01-01
    • 2023-03-27
    • 2020-12-24
    相关资源
    最近更新 更多