挑战性的问题 【关于多线程同时操作xml文件...】

evjen 2009-09-06 01:58:20
我现在遇到过这样的一个问题...
是及时数方面的问题...

有一个xml文件
里面有3个大的节点,(分别是 创建,删除,修改)
节点里面有近千个小的节点内容,每个大的节点下面都是这样的...

我原先的做法是:用一个线程来操作这个xml文件。
先是分析出3个大的节点,然后 用xmlnode在去分析子节点.[注意:每分析一个子节点出来,就要将数据入库...]

我现在的思路是这样的:

我想用3个线程同时操作这个文件里面的对应的 :create,delete,update 这个3个大节点里面的内容..
但是注意的是 还要判断 最后一个线程操作完它所对应的节点 ,那么这轮读取xml文件才能退出。
才能进入下一轮读取xml文件,
因为每隔接近一分钟就会来一个跟新数据包的xml文件。
我想,用3个线程应该比一个线程快。

现在改写的代码里面,3个线程处理这个文件 一直没有弄好...

希望给位大侠帮帮忙...

xml文件大概内容是这个样子


<?xml version="1.0" encoding="UTF-8"?>
<evjen>
<subscription-update>
<odds-model-object-changed typeId="aaa" id="1214033306">
<properties>
<property name="a1">2009-09-04 05:34:50.498</property>
<property name="a2">67.0</property>
</properties>
</odds-model-object-changed>
<odds-model-object-deleted typeId="aaa" id="1215932285"></odds-model-object-deleted>
<odds-model-object-deleted typeId="aaa" id="1215932278"></odds-model-object-deleted>
<odds-model-object-created>
<odds-model-object typeId="aaa" id="1215580620">
<properties>
<property name="a3">1.77</property>
<property name="a4">1</property>
<property name="a5">2009-09-04 05:35:10.834</property>
</properties>
</odds-model-object>
</odds-model-object-created>
</subscription-update>
</evjen>

如果某个节点不存在,那么负责读取这个节点的线程就退出此次读取...


...全文
305 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
much0726 2009-09-07
  • 打赏
  • 举报
回复
不用多线程效率是一样的。
多线程还浪费锁的效率。
ncjcz 2009-09-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 qldsrx 的回复:]
如果对方也是使用的.NET编写的程序,那么应该可以提供DataSet.WriteXml方法序列化的XML文件,否则就只能使用你上面定义的那种XML格式操作。
由于你的操作都是只读的,所以不要使用XmlDocument来操作XML文件,那样会很慢,特别是XML文件较大的情况下。你应该使用XPathDocument来创建XPathNavigator来操作XML,由于XPathDocument是只读的,所以创建的XPathNavigator执行效率很高。

创建方法参考:
C# code
XPathDocument doc=new XPathDocument("books.xml");
XPathNavigator nav= ((IXPathNavigable)doc).CreateNavigator();
[/Quote]

顶这个,300K不算大。
关键是这里:][注意:每分析一个子节点出来,就要将数据入库...
你这样要多次访问数据库,当然时间长了。
应该将所有的数据分析好之后一次入库。
ncjcz 2009-09-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 evjen 的回复:]
引用 10 楼 qldsrx 的回复:
300多K的XML文件不算大啊,怎么会不能在50秒的时间内将数据分析出来然后入库?如果使用DataSet自带的XML序列化处理,1秒钟就读取完毕了,再写入数据库的话,最多再花上几秒钟。


楼上说的 是怎么弄的啊???

我是用xmldocument来装载xml文件的
[/Quote]
这个文件好像用DataSet没法弄吧?
evjen 2009-09-07
  • 打赏
  • 举报
回复
帖子 你能沉啊
staticuser 2009-09-06
  • 打赏
  • 举报
回复
友情帮顶。。。

****************************************************************
      看帖一定要回的,分也一定要接的 ^_^
****************************************************************
evjen 2009-09-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 qldsrx 的回复:]
如果对方也是使用的.NET编写的程序,那么应该可以提供DataSet.WriteXml方法序列化的XML文件,否则就只能使用你上面定义的那种XML格式操作。
由于你的操作都是只读的,所以不要使用XmlDocument来操作XML文件,那样会很慢,特别是XML文件较大的情况下。你应该使用XPathDocument来创建XPathNavigator来操作XML,由于XPathDocument是只读的,所以创建的XPathNavigator执行效率很高。

创建方法参考:
C# code
XPathDocument doc=new XPathDocument("books.xml");
XPathNavigator nav= ((IXPathNavigable)doc).CreateNavigator();
[/Quote]


是这样子的

对方提供的是一个压缩包

我是从对方服务器下载下来之后,然后再我本地解压缩成xml文件

这样能不能用序列化了?

如果能用,能不能写点核心的代码

谢谢
t6786780 2009-09-06
  • 打赏
  • 举报
回复
编写好操作数据库的方法...分析一次就执行一次方法不行吗?
qldsrx 2009-09-06
  • 打赏
  • 举报
回复
如果对方也是使用的.NET编写的程序,那么应该可以提供DataSet.WriteXml方法序列化的XML文件,否则就只能使用你上面定义的那种XML格式操作。
由于你的操作都是只读的,所以不要使用XmlDocument来操作XML文件,那样会很慢,特别是XML文件较大的情况下。你应该使用XPathDocument来创建XPathNavigator来操作XML,由于XPathDocument是只读的,所以创建的XPathNavigator执行效率很高。

创建方法参考:

XPathDocument doc = new XPathDocument("books.xml");
XPathNavigator nav = ((IXPathNavigable)doc).CreateNavigator();
evjen 2009-09-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 qldsrx 的回复:]
300多K的XML文件不算大啊,怎么会不能在50秒的时间内将数据分析出来然后入库?如果使用DataSet自带的XML序列化处理,1秒钟就读取完毕了,再写入数据库的话,最多再花上几秒钟。
[/Quote]

楼上说的 是怎么弄的啊???

我是用xmldocument来装载xml文件的
qldsrx 2009-09-06
  • 打赏
  • 举报
回复
300多K的XML文件不算大啊,怎么会不能在50秒的时间内将数据分析出来然后入库?如果使用DataSet自带的XML序列化处理,1秒钟就读取完毕了,再写入数据库的话,最多再花上几秒钟。
evjen 2009-09-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zzxap 的回复:]
xml适合小数据,大数据用数据库,
可以叫对方把xml数据加载到数据库然后传给你的表。在数据库里面处理就很快了。

[/Quote]

这个 很难实现...
zzxap 2009-09-06
  • 打赏
  • 举报
回复
xml适合小数据,大数据用数据库,
可以叫对方把xml数据加载到数据库然后传给你的表。在数据库里面处理就很快了。
evjen 2009-09-06
  • 打赏
  • 举报
回复
我是从别个服务器上面 下载xml 文件的

lzsh0622 2009-09-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 evjen 的回复:]
瓶颈是这样的
每隔接近一分钟 就来个300多k的跟新文件
程序根本不可能在50秒的时间内将数据分析出来然后入库。

这样就会造成扎堆的现象,到后来 xml文件越积越多 根本处理不过来...

[/Quote]

试试webservice ,web上传DataSet,直接入库、存xml,不要第二次分析xml结构。
优途科技 2009-09-06
  • 打赏
  • 举报
回复
不建议多线程操作!
红街咖啡 2009-09-06
  • 打赏
  • 举报
回复
帮你顶一个。学习我。
evjen 2009-09-06
  • 打赏
  • 举报
回复
瓶颈是这样的
每隔接近一分钟 就来个300多k的跟新文件
程序根本不可能在50秒的时间内将数据分析出来然后入库。

这样就会造成扎堆的现象,到后来 xml文件越积越多 根本处理不过来...
lzsh0622 2009-09-06
  • 打赏
  • 举报
回复
三个线程不会比一个线程快,瓶颈不是在通讯上,是xml要加载到内存处理上。
月影 2009-09-06
  • 打赏
  • 举报
回复
这种情况下, 多线程好像并不能比单线程快吧?
况且, 何必等待这几个线程终止呢? 线程开始以后就让他自己灭亡好了。
下次来了任务再new 三个线程。

110,561

社区成员

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

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

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