请教关于大数据量导入到SQL SERVER的问题!!100分求助!!!!

hpc82 2007-08-21 04:35:47
小弟最近做一网站项目,有一功能是将接收到的XML数据写入数据库表中!

问题如下:
1、接到的XML文件太多,大概6000多个,其中分为两大类:酒店类型和酒店价格。解析出XML文件,发现数据条数有80万条(数据量太大);
2、目前我的做法是采用循环方式,每次解析5对XML文件,将其放入DataTable中,再采用dataadapter.Update()或者 SqlBulkCopy对象 执行批量导入数据;

但最近发现导入一次数据时间大概都在20~30分钟左右,不能满足网站项目的需求!

小弟跪求大家帮忙给个其他的什么办法,能够在大数据量下提升效率,小弟感激不尽啊!!
...全文
927 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoyuzi 2007-08-23
  • 打赏
  • 举报
回复
以前做过一个10万条的,操作数据库时用事务,把数据库的缓存加大。
zyug 2007-08-23
  • 打赏
  • 举报
回复
用多线程来做吧
brucenan999 2007-08-23
  • 打赏
  • 举报
回复
用XMLReader一次读一条记录,不要一次性把内容全放到内存里.
_甲壳虫 2007-08-23
  • 打赏
  • 举报
回复
用存储过程的openxml直接处理Xml数据,得到Table,将Table数据直接存入数据库
地下室小红叔 2007-08-23
  • 打赏
  • 举报
回复
你的格式转换效率也需要改进 尽量少用convert

看看这个帖子 有性能对照
http://community.csdn.net/Expert/topic/5698/5698294.xml?temp=.5681726
songle912 2007-08-23
  • 打赏
  • 举报
回复
up
mrshelly 2007-08-23
  • 打赏
  • 举报
回复
不推荐用XMLReader

会在回车换行上耗用太多的 loop

所以,这类还是纯文本处理来得好.
Lxpd 2007-08-22
  • 打赏
  • 举报
回复
我想也是用XMLReader吧
xeppp 2007-08-22
  • 打赏
  • 举报
回复
这么大的数据量 再优化 也是问题
mysky0103 2007-08-22
  • 打赏
  • 举报
回复
mark
honey52570 2007-08-22
  • 打赏
  • 举报
回复
同意使用xmlreader 或 xpathnavigator

速度更快
honey52570 2007-08-22
  • 打赏
  • 举报
回复
mark
pikapi 2007-08-22
  • 打赏
  • 举报
回复
我没试过,不知道用XSLT转是否会快一点,还有别用DataSet了那个占内存,你这么多文件还不慢死,直接用SQLCommand写吧。

我们有一次就是和你这个产不多的数据量,不过是导入Excel,SQLCommand就很快,而DataSet就不行了,一会速度就下来了,毕竟内存越来越少,没办法的。
andy888666 2007-08-21
  • 打赏
  • 举报
回复
我觉得这么费时的操作就应该放到线程里做
wang520d 2007-08-21
  • 打赏
  • 举报
回复
用XPATH去读XML文件应该会好些 省去了循环节点。
/// <summary>
/// 从XML文件读取dbValue
/// </summary>
/// <param name="strCol">HtmlField</param>
/// <param name="strHtmlValue">strHtmlValue</param>
/// <returns>返回dbValue</returns>
public string GetValue(string strHtmlFieldName, string strHtmlValue, string sSourceWebsite, int productType, string sProductTypeText)
{
string sInsertVal = "0";//给代码赋初值
//以后须把'手机','danawa.com.cn'这两个值也做成参数传递之
string strXPath = "//Product[@type='" + sProductTypeText + "' and @webURL='" + sSourceWebsite + "']/DBField/HtmlField[@name='" + strHtmlFieldName + "']/ValueRelations/Relation[@htmlValue='" + strHtmlValue + "'] /@dbValue";
XmlNode xnXPath = xmlDoc.SelectSingleNode(strXPath);
if (xnXPath != null)
{
sInsertVal = xnXPath.Value;
}
return sInsertVal;

}
hpc82 2007-08-21
  • 打赏
  • 举报
回复
单个的XML文件大小不一,小的以字节计算,大一点的有30~40K吧
lxwin01 2007-08-21
  • 打赏
  • 举报
回复
还有一个文件大概有多大?如果一个Xml过大,应该使用xmlreader来进行读取。
lxwin01 2007-08-21
  • 打赏
  • 举报
回复
自己定义模型类,使用手工插入。
在对Xml文件做分类,一个任务完成一定数量的Xml文件,多开几个线程来完成你任务的操作。
如:6000个文件分10个任务来完成。
hpc82 2007-08-21
  • 打赏
  • 举报
回复
因为我使用了进度条显示整个过程,感觉解析还是比较快的,但可能是数据量确实太大了,算法修改到20分钟左右的时候就再也进行不下去了。。。

听说可以用SQL SERVER的DTS方法 和 临时表来做这个东东,但是没有思路,大家怎么看呢??
hpc82 2007-08-21
  • 打赏
  • 举报
回复
doc.Load(FileName);

XmlNode node = doc.SelectSingleNode("//RateAmountMessages");
if (node.InnerXml != null)
{
HotelCode = Convert.ToInt32(node.Attributes.GetNamedItem("HotelCode").InnerXml);
//酒店PID
//解析房量
XmlNodeList node_HotelAvaillist = doc.SelectNodes("//Inventory");
foreach (XmlNode node_HotelAvail in node_HotelAvaillist)
{
allotment = 0;
cutoff = 0;
planCode = "";
roomType = "";
//=============
avstatus = "";
//==============


foreach (XmlElement F in node_HotelAvail.ChildNodes)
{
if (F.Name == "StatusApplicationControl")
{
T_from = Convert.ToDateTime(F.Attributes.GetNamedItem("Start").InnerXml);//开始日期
T_to = Convert.ToDateTime(F.Attributes.GetNamedItem("End").InnerXml);//结束日期
planCode = F.Attributes.GetNamedItem("RatePlanCode").InnerXml;//PLAN
roomType = F.Attributes.GetNamedItem("InvCode").InnerXml;//房型

}
else if (F.Name == "InvCounts")
{
XmlNode G = F.FirstChild;
XmlNode H = G.FirstChild;

allotment = Convert.ToInt32(G.Attributes.GetNamedItem("Count").InnerXml);//可用房量
cutoff = Convert.ToInt32(H.Attributes.GetNamedItem("AbsoluteCutoff").InnerXml);//前置期
//========================================
avstatus = G.Attributes.GetNamedItem("Status").InnerXml;
//======================================================

}
}

if (T_from == T_to)//如果是当天
{

DataRow drRate = allotTable.NewRow();
drRate["Property_id"] = HotelCode;
drRate["plancode"] = planCode;
drRate["Availdate"] = T_from.ToString("yyyy-MM-dd");
drRate["Allotment"] = allotment;
drRate["RoomCode"] = roomType;
drRate["RateCode"] = planCode.Substring(roomType.Length+1);
drRate["T_from"] = T_from.ToString("yyyy-MM-dd");
drRate["T_to"] = T_to.ToString("yyyy-MM-dd");
drRate["cutOff"] = cutoff;
//============
drRate["AvStat"] = avstatus;
//==============
allotTable.Rows.Add(drRate);

}
else//如果是时间段,算出时间间隔并循环加入datatable
{

TimeSpan ts1 = new TimeSpan(T_from.Ticks);
TimeSpan ts2 = new TimeSpan(T_to.Ticks);
TimeSpan ts = ts2 - ts1;

for (int i = 0; i <= ts.Days; i++)
{

DataRow drRate = allotTable.NewRow();
drRate["Property_id"] = HotelCode;
drRate["plancode"] = planCode;
drRate["Availdate"] = T_from.AddDays(i).ToString("yyyy-MM-dd");
drRate["Allotment"] = allotment;
drRate["RoomCode"] = roomType;
drRate["RateCode"] = planCode.Substring(roomType.Length+1);
drRate["T_from"] = T_from.ToString("yyyy-MM-dd");
drRate["T_to"] = T_to.ToString("yyyy-MM-dd");
drRate["cutOff"] = cutoff;
//============
drRate["AvStat"] = avstatus;
//==============
allotTable.Rows.Add(drRate);
}
}

}

}
WriteToText("文件" + FileName + "已解析");
WriteToText("正在删除" + FileName);
File.Delete(FileName);//完了删除解析过的文件

以上就是解析一个文件的方法。。。。。
加载更多回复(12)

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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