1 程序背景:
扫描用户指定的路径下的以某一个后缀结尾的文件,暂定为.srh,然后通过文件映射的方式从文件头读出一些信息,然后把这些信息形成一行记录存入一个文本文件中。扫描后的文件信息存入TStringList中,然后逐一打开然后取信息,把信息存入另外一个TStringList中,然后存入文本文件中。
2.问题:
当用户的文件数在1W-2W这个区间,处理的速度很快,经验值是1W,20s,2W,1分钟,后来我找了一个18W个文件数来试验,结果用了4个多小时,18W/2W * 1 = 9分钟,但是结果却是4个小时,这个差的太远了。
3.分析可能性:
1)查找文件很慢。的确,文件数多了,查询的速度比较慢,但是差别不大,结果比较满意。
2)TStringList在数据量大的时候需要改写capability造成的?一次性将其capability改为20W,效率上没什么提高
3)多线程,亦不凑效
4)有人说TStringList在Count<=5000的情况下很有效率,于是在记录满了5000,就先存入文件中,然后清除TStringList,结果还是不让人满意。。
5)无奈至极,到CSDN发帖求助。
4.补充说明:处理的文件本身不大,基本维持在5M左右,我映射的时候只映射我需要的那个结构的大小,获取信息之后就马上关掉。可以说这个程序的IO操作频繁,但是计算量不大,所以程序运行的时候,不怎么吃CPU,这也是效率提不起来的问题
扫描用户指定的路径下的以某一个后缀结尾的文件,暂定为.srh,然后通过文件映射的方式从文件头读出一些信息,然后把这些信息形成一行记录存入一个文本文件中。扫描后的文件信息存入TStringList中,然后逐一打开然后取信息,把信息存入另外一个TStringList中,然后存入文本文件中。
2.问题:
当用户的文件数在1W-2W这个区间,处理的速度很快,经验值是1W,20s,2W,1分钟,后来我找了一个18W个文件数来试验,结果用了4个多小时,18W/2W * 1 = 9分钟,但是结果却是4个小时,这个差的太远了。
3.分析可能性:
1)查找文件很慢。的确,文件数多了,查询的速度比较慢,但是差别不大,结果比较满意。
2)TStringList在数据量大的时候需要改写capability造成的?一次性将其capability改为20W,效率上没什么提高
3)多线程,亦不凑效
4)有人说TStringList在Count<=5000的情况下很有效率,于是在记录满了5000,就先存入文件中,然后清除TStringList,结果还是不让人满意。。
5)无奈至极,到CSDN发帖求助。
4.补充说明:处理的文件本身不大,基本维持在5M左右,我映射的时候只映射我需要的那个结构的大小,获取信息之后就马上关掉。可以说这个程序的IO操作频繁,但是计算量不大,所以程序运行的时候,不怎么吃CPU,这也是效率提不起来的问题
解决方案 »
- 怎么屏蔽注册表 IE下载完成后发出通知 选项啊?
- 有个想法,但不知道如何用Delphi实现!
- .NET平台Pascal语言Chrome发布Beta版
- 一个字符串的问题??????十万火急
- 哪位大虾能告诉我在局域网中如何通过服务器转发信息,在线等!!!
- 如何不使用第三方插件直接打印DBGrid中的内容?
- 执行存储过程时出现错误:"字符串XXX之前有未闭合的引号",100分!
- 这样的查询语句怎么写??
- 兄弟们,delphi中有没有办法实现像flashget一样,把IE中的连接拖放到得到连接名称及地址?
- DBCHART控件用法:
- DELPHI STRINGGRID 改变列宽
- 问个比较简单的问题 自定义了一个新类出错
如:for i := 0 to FileList.Count - 1 do
[
starttime = gettickcount;
DoMyJob(...);
Time = GetTickCount - StartTime;
// 大于10S的显示一下
if Time > 10000 then
Memo1.lines.add(FileList[I] + '花费了:' + InttoStr(Time);
]找到费时间的了,就找到对应DoMyJob那函数里,再显示更详细的日志,一点点分析,没啥技艺
基本上条件一边输入,符合的条件的结果们就列出来了.毫无延迟.
如果楼主确定不是查找文件的影响就是你的用法或者设计模型有问题了