社区
ASP
帖子详情
ASP高手请进,高分问题
subzero
2000-07-20 03:20:00
我写的论坛用了一个递归函数取记录,形式如CHINAASP的论坛
代码很简练但是发现CPU的占用率非常高
请问怎样解决,请详细说明
不胜感激
...全文
382
20
打赏
收藏
ASP高手请进,高分问题
我写的论坛用了一个递归函数取记录,形式如CHINAASP的论坛 代码很简练但是发现CPU的占用率非常高 请问怎样解决,请详细说明 不胜感激
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
20 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
subzero
2000-07-21
打赏
举报
回复
问题解决了:)
谢谢大家
linfeng
2000-07-21
打赏
举报
回复
subzero
你是怎么解决的?
w102272
2000-07-21
打赏
举报
回复
我认为完全递归并非最优。
其实目的就是leslielu的说的,找树型显示。
但是采用递归,因为不能保存每次查询的记录集,
所以每找到一个子结点,走完它的子树后,回退都要发出重复查询。
最好的情况下,共享一个连接,系统开销也是非常大的。
这种递归方式的深度优先遍历算法并不好。
在最好的情况下,所有帖子都是前一个帖子的跟帖,这种线性化的方式
也要花费N*(n+1)/2的SQL查询数。每多一个结点,就要多一次回归后的恢复查询。
优化方法:
帖子一般都是有唯一ID号的,而且这个ID号总是在不断增加的。
跟帖子给两个字段:parentid,id两个字段。
时间的增加,会呈现如下的数据:
ID, 上级帖子ID
0 none
ID 自己的ID=(新问题) 或者父帖子的ID (父帖子的回复帖子)
这样只要指定最开始的查询点,(从某天的帖子开始),
每次发出一个SQL 查询,都可以获取该父帖子的所有下一级帖子的回复。
即:把所有帖子想象成树,展开的方式是每次一层。
这样我的论坛的树型结构将以树丛的方式生长,而不是一个枝条一个枝条的。
而且我可以任意决定展开到什么级别。
例如下图所示:
ID,PID ID PID
+ 0 0 0 0
+ 1 0 1 0
+ 2 0------第一层 4 0
+ 5 5------第一层 5,5 (多线索的,在问题0答复期间又提出新问题)
+ 3 2------第二层 7 4
+ 6 5------第二层 6,5 (多线索的,在问题0答复期间对问题5回复)
+ 4 3------第三层 15 7
。。。。。
由于问题是多线索的,为了保证我每次都能够处理完一个帖子的所有下级帖子而不混乱。所以在SELECT 我一定要使用ORDER BY parentid desc, id asc. 同时,由于增长的ID本身隐含了按时间从旧到新的展开。为了保证论坛总是先看最新的帖子,只需要 ORDER BY PARENTID DESC的逆序就可以了。
在得到分层的处理数据后,需要做的就是自上而下的扫描,处理所有的文章,并把它们生成的文本插入到合适的地方上(生长的树丛的某个枝条上)。为了做到这一点,
为返回的文本开一个大文本缓冲区,我们在里头反复加工直到得到最终的结果。
另外,我们还需要做一个数组来保存每个文本的插入点。一旦某个PARENTID需要处理,就把它加到集合中,处理完毕后就从集合中删除掉(包含那些叶子结点)。直到循环到达记录集的终点。
上面的例子为:(0)->(0,1)->(0,1,4)->(4,7)->(7,5)->(7,5,6)->(7)->(7,15)
在所有加工完成后:
将文本缓冲区中的内容输出,就得到了树型展开的结果。
这样处理:
1、不再需要保持递归算法的大量变量(占用服务器资源),何况数据表本身是不能象局部变量那样保存的。
2、利用SQL ORDER排序和一次查询大大提高了性能。
3、将对数据库的递归查询变成在服务器上对集合的操作和对字符串的处理,这些在
服务器内存中执行的处理显然比数据库访问要快太多了。
4、这样编程量会比较大。
这种方法比较通用。
--------------------------------------------------------------------
还有一种方法,是在数据库上做编码,
比如:
新帖子ID 0
新帖子的同级别回复帖子: 01 , 02...
回复的回复 011,021。。。
这样在取帖子的时候,就可以一次SELECT取出所有分级了。
这种方法很简单,速度也不慢。
缺点是每个级别的回复编码空间是有限的。如果回复很多,编码就会很长,
对于论坛这种应用是足够的,对付层次很高的树型数据就有限制了。
subzero
2000-07-20
打赏
举报
回复
就是递归的论坛
象CHINAASP那样形式的
FOLLOWID是跟帖编号,ID为自动编号
所有首发帖子的FOLLOWID为0
跟帖的FOLLOWID为父帖的ID
leslielu
2000-07-20
打赏
举报
回复
^o^我做过和你一样的功能,是招上级帖子,其实就是要树型显示,是吧.
我用VB作DLL来实现这个功能,程序和你的差不多,但是数据库方面我用的是存储过程.
封装它吧,这样的递归没法再优化了.
蝈蝈俊
2000-07-20
打赏
举报
回复
效率差,是由于反复的连接数据库,这个程序最好用在想测试系统行能时。
我看了半天,你到底要实现个什么功能????
subzero
2000-07-20
打赏
举报
回复
少打了
在
loop跟end sub之间
rs.close
set rs=nothing
subzero
2000-07-20
打赏
举报
回复
<%
rs.open "select * from bbs where followid=0 order by id desc",cn,1,1
do until rs.eof
------
输出
------
findnextrecord rs("id")
rs.movenext
loop
sub findnextrecord(followid)
dim rs
rs.open "select * from bbs where followid=" & followid,cn,1,1
do until rs.eof
-------
输出
-------
findnextrecord rs("id")
rs.movenext
loop
end sub
%>
w102272
2000-07-20
打赏
举报
回复
首先应该优化你的程序结构,把程序贴出来看看吧。
蝈蝈俊
2000-07-20
打赏
举报
回复
具体的降低CPU的占用率很难说。
不过效率是肯定提高的。
蝈蝈俊
2000-07-20
打赏
举报
回复
com+组件是可以利用 线程spooling,数据库spooling,提高应用程序的执行效率。
简单的说就是可以使公用的部分可以重用。
subzero
2000-07-20
打赏
举报
回复
是否能够在写入数据库就实现递归了呢
subzero
2000-07-20
打赏
举报
回复
CPU的占用率高达90%
subzero
2000-07-20
打赏
举报
回复
CPU的占用率高达90%
如果用组件的话能够降低到多少?
蝈蝈俊
2000-07-20
打赏
举报
回复
那就把你的代码贴出来,尽量帮你优化一下。
subzero
2000-07-20
打赏
举报
回复
除此之外没有其他解决办法了吗?
leslielu
2000-07-20
打赏
举报
回复
同意ghj1976将你的递归算法封装起来.
蝈蝈俊
2000-07-20
打赏
举报
回复
用com+组件
szdino
2000-07-20
打赏
举报
回复
你把你写的程序片断贴出来啊
qiuhao
2000-07-20
打赏
举报
回复
使用定时刷新对服务器的负担轻
基础
各位兄弟,在SDK编程中如果实现窗口分割呢?请问怎么得到一个函数的执行时间,单位毫秒!如何调试
asp
组件呀。用vc++调试编制的组件怎样画一个箭头?
高分
请教如何限制程序运行的方法?求助:通过编程DirectX抓屏------>masterz:再麻烦你一下,谢谢熟悉RichEdit的朋友过来看一下,RichEdit的几个
问题
.如何对 I/O 端口进行操作?有了该
问题
就有了思考(100分 献礼!)如何
WEB开发文档2 总结
转自:http://blog.donews.com/lvjiyong/archive/2006/06/29/931071.
asp
x怎样将后台生成的在内存中的图象显示到客户端Microsoft IE WebControls下载地址如何在DATAGRID中使用JAVASCRIPT脚本控制DataGrid中连接到下一页显示数据下载中文名文件时保存文件名乱码
问题
关于用
ASP
.net绘图的
问题
,请大虾指教那
根据根据图片的url怎么取得图片ImageView对象
我用的是SQLite数据库,表中只有只有与图片相关的 图片名称和图片地址这两个字段,那么怎么查出返回一个ImageView对象呢?图片是根据url从网上搜到的, 大家帮帮忙想想怎么得到,谢谢啦.... http://www.buildapp.net/android/s.
asp
?q=p_w_picpath 如何判断当前状态下gps开关是打开还是关闭 依然是音乐播放器的
问题
...
基础类 - SQL语句
基础类 - SQL语句
转载请标明出处: http://blog.csdn.net/hz/archive/2006/03/01/613376.
asp
本文来自 CSDN 博客。x
sql server 怎么跨库查询?
如何判断字符的大小写 ?
如何得到动态 SQL 中取得的值 ?
如何定义动态游标 ?
已知:当前时间 ( 截取 yyyy-mm 目标 1 查询进销存表当中距离当前时间连续 3 个月内进货数量 =0...<
C/C++ C++ / 面向对象 FAQ
C/C++ C++ / 面向对象 对象与类 成员函数、全局函数和友元函数的差别? 写一个c++的类时,对于成员函数,私有变量的考虑好吗? 关于const 在const reference parameter中使用的大不解 C++中虚函数和纯虚函数的概念,差别和分别存在的原因 为何析构函数中的cout不起作用 请高
ASP
28,390
社区成员
357,068
社区内容
发帖
与我相关
我的任务
ASP
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
复制链接
扫一扫
分享
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章