请教大家一个问题:
我现在有两个数据结构相同的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
我现在有两个数据结构相同的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
解决方案 »
- 水晶报表问题,在线等
- 【求助】WMI的ASSOCIATORS OF 如何在C#下的使用.
- 关于C#中接口和static关键字的疑问
- 求个nhibernate的项目源码
- 请高手来帮忙啊如何用C#正则表达式 把 <div>${中国,CHINA}$</div> 替换成 <div><a href=a.aspx?id="${中国,CHINA}$">${中国,CHINA}$</a></div>
- c# 操作并口调用INPOUT32.DLL SEHException 外部组件异常 求解决办法
- 用ADO.net操作数据库(插入,更改等)代码好象没有问题,但我在打开SQL SERVER2000企业管理器时怎么数据表不随着更新,还有一个问题就是数据
- 多IP服务器 如何指定一个IP访问网页
- ACCESS数据库更新的问题
- 关于在 .NET的Project中中导入vc6.0写的dll文件
- ASP.NET之XML:要插入的节点出自不同的文档上下文
- C#问题 求高手教导
1.把要对比的表A 中的数据 写个sql 全部弄一个临时表B 中
2.从B中抽出1W条出来,这时候可以直接用 SELECT top 10000 FROM B ORDER BY 标识列
抽出来的1W 条数据进行对比。
3.对比完成后,删除掉 表A中前1W 条,再去前1W条 ,循环这样做应该可以,供参考