首页 > 学技术 > 技术网文 > IBM AS400应用论坛 > 正文

[精彩] 读遍一个大文件有什么好的方法吗?


来源 chinaunix.net 酷勤网整理

一个数据量很大的文件(千万左右)如果正常的从头读到尾,大概需要几十分钟,如果对一些特殊的记录还要做特殊处理的话,时间就会更长,有什么好的方法能快速的读遍整个文件吗?

试过在f表加block关键字,但是效果不明显,而且中间特殊记录的处理仍然会耗费很多时间

还想过建个数据区,把当前读到的rrn写到数据区里,然后同时运行多个程序,每个程序从数据区里面取rrn,根据rrn读取数据,但是这就又增加了读取数据区的时间和等待数据区解锁的时间,虽然同时运行足够多的程序会提高一定的时间,但是占用资源较大

还有什么好的方法吗?



 mickeycheng 回复于:2006-01-04 16:44:17

引用:原帖由 Eagle_wolf 于 2006-1-4 16:40 发表
一个数据量很大的文件(千万左右)如果正常的从头读到尾,大概需要几十分钟,如果对一些特殊的记录还要做特殊处理的话,时间就会更长,有什么好的方法能快速的读遍整个文件吗?

试过在f表加block关键字,但是效果不明显 ... 



请问你读遍整个文件的目的是什么?如果仅仅是取得记录数那么不需要这样读的,如果要做处理那我想只能从头到尾读了。


 Eagle_wolf 回复于:2006-01-04 16:47:37

需要对符合某些条件的数据作特殊处理,只能遍历整个文件了


 sean810 回复于:2006-01-04 16:47:50

请问: 需要处理的数据占整个数据量是多少? 
        如果只是少数数据需要处理,那就建立一个index....如果需要处理全部数据,那看来也没有办法了....因为你已经用了block


 Eagle_wolf 回复于:2006-01-04 16:52:15

引用:原帖由 sean810 于 2006-1-4 16:47 发表
请问: 需要处理的数据占整个数据量是多少? 
        如果只是少数数据需要处理,那就建立一个index....如果需要处理全部数据,那看来也没有办法了....因为你已经用了block 


索引是没法子了 条件太复杂


 sean810 回复于:2006-01-04 16:58:05

啊? 我没有遇到过这样的问题...因为index能提高60%以上的性能...
因为你不用index,程序处理过程,也就不会高效了...
说来看看你的条件又多复杂?


 Eagle_wolf 回复于:2006-01-04 17:08:46

和另一个文件有关了,要求他在另一个文件某个时间范围内出现的次数不能大于一个数 例如5


 sean810 回复于:2006-01-04 17:48:09

你试试看把文件名,时间设置为index. 请设置2个index,分别是文件名,时间; 时间,文件名


 Eagle_wolf 回复于:2006-01-04 18:07:00

还有其他的条件,加索引是基本上不行了 感谢楼上!


 mamei 回复于:2006-01-04 19:02:29

opqryf
能不能达到你的要求??


 wildfish 回复于:2006-01-04 19:38:17

我说我的想法:
1。重整
2。rrn分段
3。submit多个rpg,并且确定首尾rrn,进行并行计算。
我觉得这样能够缩短时间。


 tme45 回复于:2006-01-04 20:20:59

依你这么说,那就是设计该大文件时,根本不应该这么大,可以把它分拆成多个。

我在RS6000 DB2上处理过几十T的数据,如果不分表的话,可能出现几个T的表,如果不分拆的话,就算有机器可以搞定,但也没有这样的存储设备支持得了那样的速度,分表后没有任何问题。


 tme45 回复于:2006-01-04 20:23:30

把该表分拆吧,我在rs6000 DB2上处理几十T的数据也是这样设计的


 Eagle_wolf 回复于:2006-01-05 08:54:49

引用:原帖由 wildfish 于 2006-1-4 19:38 发表
我说我的想法:
1。重整
2。rrn分段
3。submit多个rpg,并且确定首尾rrn,进行并行计算。
我觉得这样能够缩短时间。 


是个方法,不过要写很多个程序,而且以后数据在增加还要改程序,每次执行程序之前还要重整(这个的时间也不短)
也想过用share open的方法,但是它要求在同一个job下,不能并行运行程序


 Eagle_wolf 回复于:2006-01-05 08:57:24

引用:原帖由 tme45 于 2006-1-4 20:23 发表
把该表分拆吧,我在rs6000 DB2上处理几十T的数据也是这样设计的 


恩,这个是设计的问题,如何拆分?


 Eagle_wolf 回复于:2006-01-05 18:21:53

下午利用线程试了一下,利用共享文件指针的方法确实能提高很多,单进程12000条记录,没条记录用1/100000秒去处理,需要140秒,而多线程(14)同样情况下只用了不到50秒
但是由于rpgle不支持递归,只能c写 但是c操作database file 实在是太费事了 不太好


 liu__jiang 回复于:2006-01-09 14:55:53

引用:原帖由 Eagle_wolf 于 2006-1-4 16:47 发表
需要对符合某些条件的数据作特殊处理,只能遍历整个文件了 




个人意见,不必那么复杂,你不是说符合某些条件么?弄一个复合KEY,如TOSKEY,用这个TOSKEY  去  READE   在FILE,不知能不能满足楼主需要(只找符合条件的,根本不必一条一条去读);另外建议也可以采用OPNQRYF试试。


 coolk 回复于:2006-01-10 13:04:24

OPNQRYF应该更加慢的!

理想状态应该是对线程、多作业或者将档案拆分!

^_^

[ 本帖最后由 coolk 于 2006-1-10 13:06 编辑 ]


 胖有型 回复于:2006-01-11 00:26:36

没有完全领会楼主的意图,但是如果确实只是要读遍一个大文件,无非就是先DSPFD取出总记录数(记得加加上deleted的,不然就不准了),然后除一下你准备并行的总进程数,得到每个进程要处理的记录条数,最后CALL   RPG程序的时候,带上一个起始记录号,一个结束记录号就OK了。


 pbj968 回复于:2006-01-11 10:42:13

引用:原帖由 tme45 于 2006-1-4 20:20 发表
依你这么说,那就是设计该大文件时,根本不应该这么大,可以把它分拆成多个。

我在RS6000 DB2上处理过几十T的数据,如果不分表的话,可能出现几个T的表,如果不分拆的话,就算有机器可以搞定,但也没有这样的存 ... 




应该不是分表吧? 我想是将一个表的分数据块来存放,如一个表的2005年数据放在一个数据块,2006年数据放在另一个数据块,象很厚的书先分部分在分章,这查询时就较快;不知是否这样请教!


 Eagle_wolf 回复于:2006-01-11 19:54:36

引用:原帖由 胖有型 于 2006-1-11 00:26 发表
没有完全领会楼主的意图,但是如果确实只是要读遍一个大文件,无非就是先DSPFD取出总记录数(记得加加上deleted的,不然就不准了),然后除一下你准备并行的总进程数,得到每个进程要处理的记录条数,最后CALL    ... 


恩 实现方法也就只能是利用rrn并行进程处理了


 pl421 回复于:2006-01-12 08:39:42

引用:原帖由 Eagle_wolf 于 2006-1-11 19:54 发表

恩 实现方法也就只能是利用rrn并行进程处理了 



老荣出现了。




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=682222
转载请注明作者名及原文出处



收藏本页到: