请教大家一个问题:
    我现在有两个数据结构相同的DataTable,数据量大约是50万左右,现在就是要把两个DataTable进行对比,取出除主键列的其它任何一列不相同的记录.但是我现在碰到的情况是内存溢出,而且客户一定要一个这样的对比功能,要是DataTable的记录只有20万左右还可以接受,要是多了就出现内出溢出,我的代码大致是这样的。   Hashtable hashBefore = ToHashTable(dtBefore);  //ToHashTable的方法在下面。
   Hashtable hashAfter = ToHashTable(dtAfter);    for (int j = 0; j < dtAfter.Rows.Count; j++)
    {
       if (hashBefore[dtAfter.Rows[j][FieldName].ToString()] != null)
        {
             if (hashBefore[dtAfter.Rows[j][FieldName].ToString()].ToString() != hashAfter[dtAfter.Rows[j][FieldName].ToString()].ToString())
               {
                     for (int k = 0; k < arrayBefore.Length; k++)
                            {                                if (arrayBefore[k] != arrayAfter[k])
                                {
                                    count++;
                                    if (count < 36)
                                    {
                                        sqlFields += "para" + count.ToString() + ",para_start" + count.ToString() + ",para_end" + count.ToString() + ",";
                                        sqlValues += "'" + arrayBefore[k].Split('@')[0] + "','" + arrayBefore[k].Split('@')[1] + "','" + arrayAfter[k].Split('@')[1] + "',";
                                    }
                                }
                            }
                            //arrayBefore = null;
                            //arrayAfter = null;
                            DBBean.insertR("", "", "Table", sqlFields.Substring(0, sqlFields.Length - 1), sqlValues.Substring(0, sqlValues.Length - 1), "");
                        }
                    }
}
  
   //先转成Hash。hash的结构是key是主键列,Value就是Columns的记录加起来。
   protected Hashtable ToHashTable(DataTable dt)
    {
        Hashtable hash = new Hashtable();
        DataTable dtTemp = dt;        for (int i = 0; i < dtTemp.Rows.Count; i++)
        {
            string str = string.Empty;
            for (int j = 0; j < dtTemp.Columns.Count; j++)
            {
                str += dtTemp.Columns[j].ColumnName + "@" + dtTemp.Rows[i][j].ToString() + ",";
            }            str = str.Substring(0, str.Length - 1); 
                if (!hash.ContainsKey(dtTemp.Rows[i][FieldName].ToString()))
                {
                    hash.Add(dtTemp.Rows[i][FieldName].ToString(), str);
                }
            
        }        return hash;
    }
不知道各位平时遇到这种情况是怎么解决的.
    hashtable

解决方案 »

  1.   

    你可以分块处理,包括datatable,每次取出一小块,比完后,再继续取后面的,不要一下子都取出来,可能是内存不能分配给你足够的空间了
      

  2.   

    两表合并Merge,然后用Linq  Select(distinct)
      

  3.   

    既然是string,可以使用TrieTree
      

  4.   

    插入到数据库,然后在数据库用sql搞定。
      

  5.   

    思路:有表A
    1.把要对比的表A 中的数据 写个sql 全部弄一个临时表B 中
    2.从B中抽出1W条出来,这时候可以直接用 SELECT  top 10000 FROM B ORDER BY 标识列
    抽出来的1W 条数据进行对比。
    3.对比完成后,删除掉 表A中前1W 条,再去前1W条 ,循环这样做应该可以,供参考
      

  6.   

    1.放到数据库里面两个table ,分页进行比对2.封装成对象,用Plinq进行比对