DataTable内存消耗巨大

Joh*_*o75 5 c# memory csv datatable memory-consumption

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

问题是,我要处理多个文件,而对数据表的测试显示了我对37MB的csv文件进行测试所消耗的大量内存,并且内存增长到了240MB,这对许多恕我直言都是如此。我读到,数据表中有开销,我可以承受大约70MB的大小,而不是240MB,这意味着它是原始大小的六倍。我在这里读到,数据表比POCO需要更多的内存,但是差异太大了。

我戴上内存分析器,看一下是否有内存泄漏以及内存在哪里。我发现,数据表列的字符串填充在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;
    }
Run Code Online (Sandbox Code Playgroud)

Nic*_*rey 5

DataSet及其子项DataTableDataRow等组成内存关系数据库。涉及很多开销(尽管它确实使[某些]事情非常方便。

如果内存有问题,

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

您确定需要在内存中表示 CSV 文件吗?您可以通过IDataReaderSebastien Lorion 的Fast CSV Reader 之类的方式访问它们吗?