Chinaunix

标题: 并发处理解决方案,程式实现 [打印本页]

作者: tianya0229    时间: 2008-10-23 14:13
标题: 并发处理解决方案,程式实现
最近我碰到一个问题,在对表进行处理。由于记录比较多。写了一个RPGLE来跑。结果发现要1个小时左右(几百万笔资料)。太耗费时间。我希望可以把对一个表的处理分成几段同时进行。意思是:当一个表被提交要处理时候,调用的RPGLE可以实现把资料表分成几个段,让程式同时对这几段进行处理。这样一来,耗费时间就少了。在400方面好像是有一个叫并发处理的功能。只是我没有接触过,不知道如何写。请各位朋友提供点资料或者在这里指点下。谢谢!
作者: tianya0229    时间: 2008-10-23 17:21
标题: 回复 #1 tianya0229 的帖子
只要能做到并行处理就好。按顺序来处理一个表。资料量多时就很麻烦。
作者: qingzhou    时间: 2008-10-23 21:43
个人建议如下:

1。如果没使用到RRN号,建议定期对PF文件做RGZPFM;

2。在RPG程序中使用BLOCK关键词提高读写文件速度;

RPG编程通常要与物理文件、逻辑文件等各类文件打交道。在RPG的F定义行里有一BLOCK关键词,善加使用这一关键词可以大幅度提高文件的读写速度。这在对具有大量数据的文件进行批处理时,效果特别明显。使用方法如下:

文件描述规范里有一BLOCK(*YES|*NO)关键词。它控制着文件的块读写方式。该关键词只对DISK或SEQ类型的文件有效。我们常见的物理文件(PF)或逻辑文件(LF)就是DISK文件。

在缺省情况下,即F行关键词位置没有定义BLOCK时,在编译RPG程序时,对于输入记录,BLOCK缺省值为*NO,即文件不会以块的方式读入;对于输出记录,BLOCK缺省直为*YES。但上面编译缺省值需要先符合下面条件:

(1) 文件是程序描述文件(program-described)。
(2) 文件如果是外部描述文件(externally-described),则文件应只有一个记录格式(Record Format)。
(3) 在文件规范描述里(F行),不能使用RECNO关键词。

如果要使文件输入记录以块方式(BLOCK)读入,则F行必须指定BLOCK关键词,并赋值为*YES, 比如,下面定义了一外部描述的DISK类型的文件,其读入方式采用BLOCK方式:

FMYPF    IF   E         DISK   BLOCK(*YES)
作者: tianya0229    时间: 2008-10-23 22:09
标题: 回复 #3 qingzhou 的帖子
我现在要做的是把一个表的数据备份到另一个表中。原表记录备份过去后就删除。备份1笔删除1笔。不过这样,程式走的很慢。资料几百W笔。
你说的是以块方式来处理记录。那具体在程式上只要定义FMYPF    IF   E         DISK   BLOCK(*YES)。在C-REF中不用其它操作码来执行或配合吗?还不大明白具体的作法。能说个例子吗?
我这情况不适合做RGZPFM。因为资料每天都在利用。并且每天都要大笔资料进来表里。
作者: qingzhou    时间: 2008-10-24 00:03
备1笔删1笔?不明白这样处理的用意。如果想做历史数据归档,为啥不直接使用:

===> CPYF FROMFILE(LIB/PF) TOFILE(NEWLIB/NEWPF) MBROPT(*REPLACE) CRTFILE(*NO) FMTOPT(*MAP *DROP)                                                               

开始还以为利用RPG复杂计算处理一个庞大的PF文件。
作者: tianya0229    时间: 2008-10-24 08:40
标题: 回复 #5 qingzhou 的帖子
因为其中涉及到很多判断条件。不是整个表备份。是把需要的,如时间方面的限制,其他业务上的类型限制等多方面条件下,才能备份。所以才写了一个RPG。
你以上说的以块方式来处理记录。感觉效率明显吗?对于几百W笔资料都需要READ的时候。符合条件的才进行写,删操作。你有这方面的例子吗?
作者: digitalchina    时间: 2008-10-24 08:45
找个空闲的字段做个标记,然后定期一次删除.
作者: fairyboy    时间: 2008-10-24 09:09
先用CPYF过去,再最新的PF进行数据删除和维护,这样不可以吗?
作者: tianya0229    时间: 2008-10-24 09:47
不能1次性删除。每天都有资料进来。每天都要做清理及备份。其中涉及到资料的筛选。所以LS两位朋友的方面在我这不大适合。谢谢!
作者: seouldeng    时间: 2008-10-24 10:10
选择性的 CPYF也不行么?

把符合条件的用CPYF出来。把指令写进CL里边就行啦。然后再做个计划调用,不就是每次都能找到么?
作者: tianya0229    时间: 2008-10-24 11:33
标题: 回复 #10 seouldeng 的帖子
这种方法不安全。用RPG来实现,可以利用COMMIT来确保原表的资料不出问题。所以我就选择用RPG了。现在问题是:想优化程式。轻舟大哥的“以块方式(BLOCK)读入”我觉得比较适合我这边的要求。还请轻舟大哥有空详细说明个例子。
作者: digitalchina    时间: 2008-10-24 13:08
用SMBJOB 提交到后台不同的JOBQ里,就是并发执行了.
作者: tianya0229    时间: 2008-10-24 15:23
标题: 回复 #12 digitalchina 的帖子
用SMBJOB提交。嗯,那怎么把要处理的表进行数据分段呢?只有分成几段了才可以同时被处理。
作者: qingzhou    时间: 2008-10-24 16:47
原帖由 tianya0229 于 2008-10-24 11:33 发表
这种方法不安全。用RPG来实现,可以利用COMMIT来确保原表的资料不出问题。所以我就选择用RPG了。现在问题是:想优化程式。轻舟大哥的“以块方式(BLOCK)读入”我觉得比较适合我这边的要求。还请轻舟大哥有空详细 ...


前面已经讲清楚了,在F表增加参数就可以了.

另外,看看程序是否能够调入到内存去处理,效率可能会提高些.
作者: tianya0229    时间: 2008-10-24 19:58
标题: 回复 #14 qingzhou 的帖子
调到内存,是什么意思?
作者: qingzhou    时间: 2008-10-25 08:36
原帖由 tianya0229 于 2008-10-24 19:58 发表
调到内存,是什么意思?

命令SETOBJACC可以使文件或程序常驻内存
http://bbs.chinaunix.net/viewthr ... 3Ddigest&page=2
作者: mamei    时间: 2008-10-26 19:59
===========================================
http://bbs.chinaunix.net/viewthr ... p%3Bfilter%3Ddigest
=============================================
从这个贴子来可以找点灵感

可以把rrn换成其他键字,如部门编号或日期之类的
作者: tianya0229    时间: 2008-10-26 20:21
标题: 回复 #16 qingzhou 的帖子
tks.
作者: qingzhou    时间: 2008-10-26 20:52
原帖由 mamei 于 2008-10-26 19:59 发表
===========================================
http://bbs.chinaunix.net/viewthr ... p%3Bfilter%3Ddigest
=============================================
从这个贴子来 ...

恩,也是个不错的处理方案。LZ可以试试改善RPG程序。
作者: passthru    时间: 2008-10-27 01:10
除了block读取之外,为什么不用多线程处理?相当与程序几乎是并发处理。

1)改程序结构;
   把源程序每一个操作动作写入一个procedure(NO MAIN),并编译成一个module;
2)处理参数要改。
   采用每一时刻只能执行一个mudule的流文件处理参数。

多线程只能在rpg ile模式下。

另外,rpg cycle处理报表效率非常高。即,在I表定义处理输入数据,和指示器。

[ 本帖最后由 passthru 于 2008-10-27 01:26 编辑 ]
作者: tianya0229    时间: 2008-10-27 09:49
标题: 回复 #20 passthru 的帖子
不是很理解。
1.每一个操作动作写入一个procedure。怎么做到?我只有两个动作,一个写,一个删除。
2.采用每一时刻只能执行一个mudule的流文件处理参数。是什么意思?
作者: wdz315    时间: 2008-10-27 10:09
每天都有几百万数据需要处理么?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2