将数据放入DataTable,使内存超出异常

时间:2012-12-03 08:50:00

标签: c# linq datatable out-of-memory

从Datatable的值中制作标题时遇到了麻烦。我有一个文本文件,我搜索一些字符串。拆分它们并将它们放入Datatable中。之后,我使用一些linq代码将列“Name”作为此表的标题。对于小文本文件,它工作得很好但是当我得到更大的文件时,我的编译器会抛出MemoryOutOfExeption。所以我问我如何修复我的代码?

我的代码:

        DataTable evHeader00 = resAtt.Copy();

        var prds1 = evHeader00.AsEnumerable() // make Name Values as header
                        .GroupBy(c => c["Name"])
                        .Where(g => !(g.Key is DBNull))
                        .Select(g => (string)g.Key)
                        .ToList();

        prds1.ForEach(p => evHeader00.Columns.Add(p, typeof(string))); // Here i got MemoryOutOfExeption

        foreach (var row in evHeader00.AsEnumerable())
        {
            if (!(row["Name"] is DBNull))
            {
                row[(string)row["Name"]] = row["Products"];
            }
        }

DataTable 1:

 ID    Name    Products
 1      a        A
 2      b        B
 3      c        C
...    ...      ...

结果:

ID     a   b   c   ...
1      A
2          B
3              C
...   ... ... ...  ...    

1 个答案:

答案 0 :(得分:2)

  1. 为什么需要复制整个DataTable

    DataTable evHeader00 = resAtt.Copy();
    
  2. 为什么要在这里创建一个包含所有数据的新List<String>

    var prds1 = evHeader00.AsEnumerable() // make Name Values as header
                    .GroupBy(c => c["Name"])
                    .Where(g => !(g.Key is DBNull))
                    .Select(g => (string)g.Key)
                    .ToList();
    
  3. 所以这应该更具可扩展性:

    IEnumerable<string> data = resAtt.AsEnumerable()
                                     .Where(r => !r.Field<string>("Name") == null)
                                     .GroupBy(r => r.Field<string>("Name"))
                                     .Select(g => g.Key);
    

    或(正如@Rawling所评论的)使用Enumerable.Distinct,它应该更加“内存友好”:

    IEnumerable<string> data = resAtt.AsEnumerable()
                                     .Where(r => !r.Field<string>("Name") == null)
                                     .Select(r => r.Field<string>("Name"))
                                     .Distinct();
    

    现在您可以使用foreach来枚举结果。