高分求助:两个数据结构相同,行记录数为50万的DataTable进行比较对比的问题

勇敢的心515 2013-07-12 02:18:14
请教大家一个问题:
我现在有两个数据结构相同的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;
}


不知道各位平时遇到这种情况是怎么解决的.


...全文
281 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
1.放到数据库里面两个table ,分页进行比对 2.封装成对象,用Plinq进行比对
安得权 2013-07-17
  • 打赏
  • 举报
回复
思路:有表A 1.把要对比的表A 中的数据 写个sql 全部弄一个临时表B 中 2.从B中抽出1W条出来,这时候可以直接用 SELECT top 10000 FROM B ORDER BY 标识列 抽出来的1W 条数据进行对比。 3.对比完成后,删除掉 表A中前1W 条,再去前1W条 ,循环这样做 应该可以,供参考
安得权 2013-07-17
  • 打赏
  • 举报
回复
1W 条 对比一次,分批 对比 直接50W条 计算机内存占用太大了
游戏人间 2013-07-17
  • 打赏
  • 举报
回复
插入到数据库,然后在数据库用sql搞定。
勇敢的心515 2013-07-17
  • 打赏
  • 举报
回复
自己顶下。。。。
勇敢的心515 2013-07-16
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
你可以分块处理,包括datatable,每次取出一小块,比完后,再继续取后面的,不要一下子都取出来,可能是内存不能分配给你足够的空间了
前辈,这样好像保证不了数据的完整性吧?
勇敢的心515 2013-07-16
  • 打赏
  • 举报
回复
引用 6 楼 caozhy 的回复:
既然是string,可以使用TrieTree
学习了,谢谢!
threenewbee 2013-07-15
  • 打赏
  • 举报
回复
既然是string,可以使用TrieTree
DENQH 2013-07-12
  • 打赏
  • 举报
回复
两表合并Merge,然后用Linq Select(distinct)
bdmh 2013-07-12
  • 打赏
  • 举报
回复
你可以分块处理,包括datatable,每次取出一小块,比完后,再继续取后面的,不要一下子都取出来,可能是内存不能分配给你足够的空间了

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧