| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 841 人关注过本帖
标题:如何优化这个程序
只看楼主 加入收藏
oldhawk
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2012-4-30
结帖率:25%
收藏
 问题点数:0 回复次数:6 
如何优化这个程序
不上代码了,说一下思路:
 文本文件A中记录了库存产品一个月的每日变动明细,记录有数千万条(从月初到月末),表B中记录了需要统计的数百项产品,需要实现的是按照表B中的产品代码,计算当月平均日库存(每天的实际库存相加再除以当月实际天数)。
我现在的做法:
将文本A导入一个新表C中,然后按照表B的记录由表c生成表d(仅包含有用记录的表),从B中读出一条记录,按日从D中求出入库合计(sum all 出入库 to n for 日期=当日.and. 产品代码=cpdm)进行累加。
这个过程我想应该是尽量减少了运算的,但依然极慢,大约需要3-4小时。
各位,还有更好的思路吗。
*******************************
文本导入c 表的过程我是放到单独按钮完成的。文本是月末生成的,表 B 的数据也是次月初提供需要计算的。
过程:
1、按照 B 的记录 生成 D
append from c for 产品代码=b中的代码
逐条生成
2、再按照B 中的记录逐日计算
用for...to...next逐日累加库存的。
用sum all 出入库 to n for 日期=当日.and. 产品代码=cpdm 计算出入库发生额

我分析过,时间耽误在 过程1 中,生成包含有用记录的表非常耗时。

*****************************************
谢谢几位的帮助,我原来学习的是 foxbase1.1 现在用的是 vfp7.0 所以对select用法不是很熟悉,我也不是搞专业开发的,仅仅是业余爱好,一直程序中不太考虑优化,这回数据量太大了。几位的select语句我仔细分析了一下,可能没有太理解,觉得对我的问题没有彻底解决。不好意思,数据量太大(zip格式600M),传不上来,何况还有保密的问题。

我再详细表述一下我的问题:
原始记录中包括10万个产品的数千万条记录(产品每日频繁出入库),我要统计的仅仅是10万多产品中的几百条(b表)。
所以各位提到的办法用select 分组统计的办法统计10万个产品的每日合计,再在其中查找需要的数据(b表)是否更耗时间。
另外我手工测时用select ...into... 和用append from 生成表的时间相差不大(感觉测时)。

刚刚想到一个通用性不好的办法。
需要统计的数据 b 表建索引
从文本 a 导入c表的过程时,fgets()读一行,直接截取出产品编码,然后seek在b表中查找,没有找到放弃,找到写入 d表,这样速度是否能快一点。




[ 本帖最后由 oldhawk 于 2013-5-14 00:54 编辑 ]
搜索更多相关主题的帖子: 文本文件 如何 
2013-05-10 23:26
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
建议使用select语句来实现。
从文本文件A导入表C的过程也可以分散到每天或每周操作一次,也许能减少一次性导入的时间。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2013-05-11 08:37
taohua300
Rank: 12Rank: 12Rank: 12
来 自:光
等 级:贵宾
威 望:14
帖 子:1636
专家分:3906
注 册:2009-3-11
收藏
得分:0 
1. 使用sql语句
2. 对表建立索引
3. 尽量减少 like 等模糊比较使用

个性太多,无法显示
2013-05-11 08:50
kiff
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:贵宾
威 望:46
帖 子:756
专家分:2531
注 册:2013-1-30
收藏
得分:0 
"sum all 出入库 to n for 日期=当日.and. 产品代码=cpdm"
这是求出某日某产品的库存吗?
我倒觉得是求出某日某产品的的发生数的汇总数(如入库减出库的汇总,但这并不是库存,如是库存还得考虑其初数)
2013-05-11 12:09
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
把数据放上来看看

授人以渔,不授人以鱼。
2013-05-12 12:39
qingfameng
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:35
帖 子:964
专家分:3019
注 册:2010-2-6
收藏
得分:0 
用 select .. from 表C ... group by ... having ...的方法,比 append from ... 要快很多的。
2013-05-12 22:42
kiff
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:贵宾
威 望:46
帖 子:756
专家分:2531
注 册:2013-1-30
收藏
得分:0 
select a.产品代码,a.日期,sum(a.出入库) 出入库 from c表 a,b表 b into dbf d表 where a.产品代码==b.产品代码 group by a.产品代码,a.日期
可以按 产品代码,日期, 这样计算 出入库发生额,后续的要做些什么,就只有你自己清楚了。
尽量使用SQL语句 批处理。B表还可以按 产品代码 索引一下.


[ 本帖最后由 kiff 于 2013-5-13 09:24 编辑 ]
2013-05-13 09:02
快速回复:如何优化这个程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016813 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved