C# 数据表内存消耗巨大

C# 数据表内存消耗巨大,c#,memory,csv,datatable,memory-consumption,C#,Memory,Csv,Datatable,Memory Consumption,我正在将文件中的csv数据加载到数据表中进行处理 问题是,我想处理几个文件,而我对datatable的测试显示了巨大的内存消耗 我用一个37MB的csv文件进行了测试,内存增长到240MB,这对IMHO来说非常重要。 我读到,datatable中存在开销,我可以承受大约70MB的大小,但不是240MB,这意味着它是原始大小的六倍。 我在这里读到,数据表需要比POCO更多的内存,但差别太大了 我打开内存分析器,查看是否有内存泄漏以及内存在哪里。我发现datatablecolumns有6MB到19M

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

问题是,我想处理几个文件,而我对datatable的测试显示了巨大的内存消耗 我用一个37MB的csv文件进行了测试,内存增长到240MB,这对IMHO来说非常重要。 我读到,datatable中存在开销,我可以承受大约70MB的大小,但不是240MB,这意味着它是原始大小的六倍。 我在这里读到,数据表需要比POCO更多的内存,但差别太大了

我打开内存分析器,查看是否有内存泄漏以及内存在哪里。我发现datatablecolumns有6MB到19MB的字符串,datatable有大约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;
    }
private静态数据表ReadCsv()
{
DataTable=新的DataTable();
table.BeginLoadData();
使用(var reader=new StreamReader(File.OpenRead(@“C:\develope\Tests\csv Data\testdaten\test.csv”))
{               
int y=0;
int columnsunt=0;
而(!reader.EndOfStream)
{
var line=reader.ReadLine();
var值=行分割(',');
如果(y==0)
{
columnsCount=values.Count();
//创建列
对于(int x=0;x
DataTables是一种将表格数据放入内存并添加大量与表格相关功能的通用解决方案。如果开销不可接受,您可以选择1)编写自己的DataTable类,以消除不需要的开销2)使用另一种表示法,这种表示法仍然可以满足您的需要,可能是基于POCO的,也可能是一个XMLDocument(可能会有同样多的开销,可能更大,永远不用担心)。3) 停止尝试将所有内容加载到内存中,只需根据需要从外部存储中引入数据。

数据集
及其子数据表,
数据行
,等等。组成内存中的关系数据库。这涉及到很多开销(尽管它确实使[某些]事情变得非常方便)

如果内存是个问题

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

你确定你需要CSV文件的内存表示吗?你能像Sebastien Lorion那样通过
IDataReader
访问它们吗?

你想让我们猜一下,还是给我们看一些代码?我想你的代码中一定有其他对象?内存很便宜,但:也许这有助于你找到更高效的内存解决方案:@user814064内存很便宜?真的吗?今天我们使用的是
8GB RAM和更多的
,这是真的,但仍有许多其他计算机使用
2GB RAM和更少的
。如果实际数据是
2xx
MB,我不认为一个应用程序消耗
2xx
MB RAM是一个小问题。是的,真的。这里没有人开始意识到他们正在承受任何代价。我可以在几秒钟(或几分钟)内使用256兆的内存在我的电脑上,没有看到巨大的成本。我确实提供了一个链接到有用的帖子,解释了为什么数据表有很大的内存占用。是的,但6-7的系数不能。我的代码中一定有问题,否则数据表是不可用的垃圾。这就是为什么我要求其他用户提供统计/经验值进行比较。没有数据ase有这么大的开销。如果我把它们放在Sqlite中,它不会变得那么大。我编写了自己的csv阅读器、AdoAdapter、XmlReader,并设计了一个应用程序来处理内存中的数据表,用因子2的计算就可以了。但是这种开销会破坏我的设计。其他用户的体验是什么?1 Alread尝试了SilverlTelerik()提供的数据表,这不是轻量级的,它会消耗更多的内存。问题是,如果你想要编辑功能,它就不能轻量级。否则,使用字典列表会更轻量级,这是我唯一的希望。2.基于POCO的不是替代方案,因为我没有特殊的数据。每个数据都有另一个结构。3.是的,这就是我正在评估的问题lem是,我需要处理数据,构建关键列/索引,对它们进行排序……也许像sqlite这样的轻量级数据库是一条出路。这听起来很像我的选项3——有几个数据库选项。a