xudanfu
路人甲
路人甲
  • 注册日期2004-05-30
  • 发帖数48
  • QQ
  • 铜币303枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1275回复:0

[转帖]在MO中向图层添加记录的性能提高

楼主#
更多 发布于:2004-08-21 20:21
<TABLE border=0 cellPadding=0 cellSpacing=0 height=98 width="100%">

<TR>
<TD class=summary-title height=18>
<DIV align=center>在MO中向图层添加记录的性能提高 </DIV></TD></TR>
<TR>
<TD height=4 style="PADDING-BOTTOM: 5px; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 5px">
<DIV align=right>作者: zdq (http://zdq.gissky.net) </DIV></TD></TR>
<TR>
<TD height=26 style="PADDING-BOTTOM: 5px; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 5px"> 
<P>经常看到有朋友说, MO添加记录咋那么慢呢,其实MO里面有一个参数的设置,能对添加记录的性能有很大的影响。这个参数就是Recordset对象的AutoFlush属性,先看看MO帮助中的描述把:</P>
<P>The property only applies to Recordsets of MapLayers based on <b>shapefiles</b>. <FONT color=#ee1111>Setting AutoFlush to False</FONT> will result in performance improvements for "batch" type operations such as creating new shapefiles. For updates to be reliably seen as they occur, AutoFlush should be set to True. Setting AutoFlush to True will flush the file, as will StopEditing or releasing the Recordset object.</P>
<P>然后用下面的代码测试一下效果:</P>
<P>  Dim dc As New DataConnection, lyr As New MapLayer, tb As New TableDesc, rs As Recordset
  Dim W As Double, H As Double, pt As New Point, t As Date
  dc.Database = "E:\"
  If Not dc.Connect Then Exit Sub
  Set lyr.GeoDataset = dc.AddGeoDataset("TestSpeed", moShapeTypePoint, tb)
  If Not lyr.Valid Then Exit Sub
  Map1.Layers.Add lyr
  Set rs = lyr.Records
  Randomize
  H = Map1.Extent.Height
  W = Map1.Extent.Width
  '关键代码行, 注释后添加的效率就会非常低
<EM><b>  rs.AutoFlush = False</b></EM>
  t = Now
  For i = 1 To 1000
    pt.Set Rnd * W, Rnd * H
    rs.AddNew
    rs.Fields("Shape").Value = pt
    rs.Update
    Text1.Text = "当前位置:" ; i
    DoEvents
  Next
  rs.StopEditing
  Map1.Refresh
  Text2.Text = "总计耗时(秒): " ; DateDiff("s", t, Now)
</P>
<P>就会发现添加1000条记录的时候,如果autoflush为false,那么不到1秒就可以完成,否则需要80秒左右。如果添加1000条记录,效果就更加明显了。</P>
<P>看来在成批添加数据的时候,还是考虑一下这个东东吧。</P></TD></TR>
<TR>
<TD height=4 style="PADDING-BOTTOM: 5px; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 5px"> </TD></TR>
<TR>
<TD height=4 style="PADDING-BOTTOM: 5px; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; PADDING-TOP: 5px">
<DIV align=left>(作者联系方式: 更多zdq的作品请访问: http://zdq.gissky.net )</DIV></TD></TR></TABLE>
喜欢0 评分0
游客

返回顶部