DataTable内存消耗巨大

时间:2013-08-26 16:41:43

标签: c# memory csv datatable memory-consumption

我正在将文件中的csv数据加载到数据表中进行处理。

问题是,我想要处理多个文件,而我对数据表的测试显示了巨大的内存消耗 我测试了一个37MB的csv文件,内存增长到240MB,这是很多恕我直言。 我读过,数据表中存在开销,我可以使用大约70MB的大小,但不是240MB,这意味着它是原始大小的六倍。 我在这里读到,数据表需要比POCO更多的内存,但差别太大了。

我放了一个内存分析器看看,如果我有内存泄漏和内存在哪里。我发现,datatablecolumns有6MB到19MB之间填充字符串,数据表有大约20列。值是否存储在列中?为什么需要这么多内存,我该怎么做才能减少内存消耗。 有了这个内存消耗数据表似乎无法使用。

有没有其他人对数据表有这样的问题,或者我做错了什么?

PS:我尝试了70MB的文件,数据库增长到500MB!

好的,这是一个小测试用例: 37MB的csv文件(21列)让内存增长到179MB。

    private static DataTable ReadCsv()
    {
        DataTable table = new DataTable();
        table.BeginLoadData();

        using (var reader = new StreamReader(File.OpenRead(@"C:\Develop\Tests\csv-Data\testdaten\test.csv")))
        {               
            int y = 0;
            int columnsCount = 0;
            while (!reader.EndOfStream)
            {
                var line = reader.ReadLine();
                var values = line.Split(',');

                if (y == 0)
                {
                    columnsCount = values.Count();
                    // create columns
                    for (int x = 0; x < columnsCount; x++)
                    {
                        table.Columns.Add(new DataColumn(values[x], typeof(string)));
                    }
                }
                else
                {
                    if (values.Length == columnsCount)
                    {
                        // add the data
                        table.Rows.Add(values);
                    }
                }

                y++;
            }

            table.EndLoadData();
            table.AcceptChanges();

        }

        return table;
    }

2 个答案:

答案 0 :(得分:2)

DataSet及其子DataTableDataRow等构成内存中的关系数据库。涉及很多开销(虽然它确实使[某些]事情变得非常方便。

如果内存有问题,

  • 构建域对象以使用类型属性表示CSV文件中的每一行。
  • 创建自定义集合(或只使用IList<T>来保存它们
  • 或者,使用DataTable的基本语义构建一个轻量级类:
    • 按号码选择行的功能
    • 能够按行号和列名或编号选择行中的列。
    • 了解有序的列名集的能力
    • 奖励:能够按名称或序号选择列并接收其值列表,每行一个。

您确定需要CSV文件的内存中表示吗?你可以通过IDataReader像Sebastien Lorion的Fast CSV Reader访问它们吗?

答案 1 :(得分:0)

DataTables是将表格数据放入内存并添加大量与表相关的功能的通用解决方案。如果您无法接受开销,则可以选择1)编写您自己的DataTable类,消除您不需要的开销2)使用仍然可以完成您所需的替代表示,可能是基于POCO的,或者可能是XMLDocument (也许可能有更多的开销,从来没有真正担心它)。 3)停止尝试将所有内容加载到内存中,并根据需要从外部存储中提取数据。

相关问题