TXMLDocument的速度问题!!!(300分)

  • 主题发起人 主题发起人 道长
  • 开始时间 开始时间

道长

Unregistered / Unconfirmed
GUEST, unregistred user!
当父节点拥有几万个子节点时,执行速度及慢
(xml文件28M,只有一个Root节点,Root下有66352个子节点)
Node_P:=XMLD.DocumentElement;
20多秒
Node_C:=Node_P.ChildNodes.First;
10分钟,耗内存180M
机器配置绝对没问题,1G*4 CPU,1G*2 内存
谁有更好的将xml文件导入数据库的更好的方法,速度要快,500分奉送!!!
 
先用TADODataSet的LoadFromFile将它加载进来,再导入呢?
 
非标准XML文件,没有字段说明的,所以不能LoadFromFile
 
先摘一段xml文本上来分析一下,数据库是什么数据库?
 
<?xml version="1.0" encoding="gb2312" ?>
- <!--
@Author: oyds,LegendNet
@Created:
@Modified:
@Purpose: export data
@Description:
startTime is the begin
data
endTime is the end data
RowData is a data and the attribute is column name
-->
- <Doc-Root createTime="1052882245282" dataKey="CSC_traffic" startTime="1052756245176" endTime="1052842645176">
<RowData PERIOD="1" ST32="0" ST31="0" CS_INDEX="1" ST30="0" ST9="0" ST8="0" ST7="0" ST6="0" ST5="0" ST29="0" ST4="0" ST28="0" ST3="0" ST27="0" ST2="0" ST26="0" ST1="0" ST25="0" ST24="0" ST23="0" ST22="0" ST21="0" ST20="0" SAMPLEDATE="2003-05-13 00:30:00.0" ST19="0" ST18="0" ST17="0" ST16="0" ST15="0" ST14="0" ST13="0" ST12="0" ST11="16" ST10="0" NODE_ADDR="10.40.1@10.122.210.1" />
..............66352个
<RowData PERIOD="1" ST32="0" ST31="0" CS_INDEX="1" ST30="0" ST9="0" ST8="0" ST7="0" ST6="0" ST5="0" ST29="0" ST4="0" ST28="0" ST3="0" ST27="0" ST2="0" ST26="0" ST1="0" ST25="0" ST24="0" ST23="0" ST22="0" ST21="0" ST20="0" SAMPLEDATE="2003-05-13 00:30:00.0" ST19="0" ST18="0" ST17="0" ST16="0" ST15="0" ST14="0" ST13="0" ST12="0" ST11="2" ST10="0" NODE_ADDR="8.40.33@10.122.208.33" />
</Doc-Root>

 
我是读取每个条记录的Attributes,组成一条SQL语句,然后插入sql server 2000数据库
(或许有更好的办法)
瓶颈不在数据库端,主要是Node_C:=Node_P.ChildNodes.First;耗时太长!
期待您的答复.....
 
呵呵,放弃xml概念,(因为我不懂)
按照文本方法来处理数据。
如果是oracle的话可以写存储过程用sqlload转数据库,so快。
估计你只能一条条插入了
 
如果你用TXMLDocument来做数据库,那乘早改掉。
 
就没有好的解决办法了吗?????
 
分成10个小的XML行不行?[:)]
 
大容量的XML文件,建议用SAX 接口读取.
 
能否具体讲讲??
 
SAX 接口是事件驱动,不会一次性读入整个XML文件,是边读边解析
DOM 接口是一次读入整个文件,
delphi 中用 SAX 有免费控件(我记得),或用MSXML SAX API.
 
torry上面有xml解析的组件,试试看解析的速度如何,
我也曾经自己解析xml,速度巨快,和文件大小没有关系
不过算法一般都是专用的,要写通用的不太容易
 
http://www.torry.net/html.htm
 
to LiChaoHui
你自己是如何解析的?
我的速度主要耗在
Node_C:=Node_P.ChildNodes.First;
10分钟,耗内存180M
寻找第一个子节点上
 
我是自己分析标记的,算法是针对所有的标记语言的,
按顺序处理文本文件就可以,
用类似于自动状态机的方法来处理这种语法,
处理后,程序直接分离出节点名称,节点取值,以及所有的节点属性,
将层次保存在栈里面,就能知道当前节点的路径了,
就可以根据需要决定是否读取某些取值或属性的值
标记语言的一般语法是:
<tagname attribute1=value1 attribute2="the value2" other=hello>nodevalue</tagname>
或者
<tagname attribute1=value1 attribute2="the value2" other=hello />
 
主要是我的那段代码丢了,所以也没有办法给你看了,只能给你提供思路了
 
XML解析器本来就有这个问题,事实上,用 XML 来替换数据库操作还有待时日。
问题类似于用一个文本数据库来操作,你说能快吗?何况 XML 还需要复杂的额外
处理。听过 IBM 的 XML 解析器速度要快些,但我想应该快不到哪儿去!反正我
不用 XML 来处理规则型列表数据。
--------------------------------------------------------------------------------------
灌水,废话,看过就算,不要当真
 
同意Adanz例用sax,dom会把xml一次载入内存,而sax不会
一般在文件小和要改xml结构时才用dom
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部