记录分组和聚合

问题描述 投票:0回答:1

我有一个固定记录文件,其中包含数百万条记录,其中包含数千名客户的销售情况。我需要为每个客户生成一条记录的文件,其中包含客户 ID、销售数量和销售总额。

我刚刚开始学习 COBOL,我不知道什么是“COBOL 方式”。

其他编程语言中显而易见的方法是使用某种映射,但 COBOL 缺乏这种结构。从性能角度考虑,COBOL 数组是不可能的。

我想到的其他解决方案是利用数据库,但对于如此琐碎的任务来说,它似乎有点过分了。

有人能指出我正确的方向吗?

cobol
1个回答
0
投票

这一点我怎么强调都不为过。如果这是一个“一次性”程序,甚至每月运行一次,则应优先使用 COBOL SORT,而不是花时间让它更快。


这个方法类似于“无序映射”。

创建两个表:一个“哈希指针表”(HPT),其条目数多于客户数量(首选质数,条目越多有利于散列值的分布)和一个可变长度(ODO)“记录表” “(RT)足够大,可以保存所有可能在场的顾客的记录。

HPT 由一个整数值组成,其中零表示该值没有记录,而正整数用作记录表的下标。

RT 条目由两部分组成:一个指向链表 (LLP) 中下一个条目的整数和一个包含记录字段(客户 ID、销售计数和销售总额)的组。链表用于溢出,应该很短——只有几条记录。

整数RTP用于指向下一个可用的RT条目。初始值为零。它还用于设置 RT 的长度。 (发生取决于 RTP)

读取每条记录时,客户 ID 会被“哈希”为 HPT 中条目数量内的整数。这涉及到对客户id的字符的操作,对HPT大小的

MOD

操作,以及对

ADD
的操作。
要插入或累加值,首先使用哈希值访问 HPT。

如果 HPT 条目为零,则通过向 RPT 加 1 来插入记录,将 RPT 移动到该哈希值的 HPT 条目,将零移动到 RTP 的 LLP,将客户 ID 和销售额移动到 RT 条目计数为 1。

如果HPT条目不为零,则使用HPT条目的值跟随RT中的链表来确定是否存在客户记录(匹配客户id)。如果该记录存在,则将计数加 1,并将销售额添加到销售总额中。如果记录不存在,(LLP 为零)为 RT 创建一个新条目,就像将 RTP 移动到链表中最后一个记录的 LLP 而不是 HPT 条目一样。

处理完所有记录后,该表将包含 RTP 条目。使用内存中排序对客户 ID 进行排序并输出值。

此方法需要的存储空间不应超过几兆字节。

一些注意事项。

此方法对哈希函数值的分布很敏感。

如果更频繁的访问到达链表的末尾,性能会变慢。

随着客户数量的增加,表大小将需要增加,这可能会导致哈希函数值的分配问题。

我只用过一次这种方法——二十多年前的一次字数统计速度挑战。挑战在于程序能够以多快的速度计算大型文本文件中不同单词的数量。它非常快,比其他方法快得多。它与这个问题有一些相似之处。

我花了几次尝试才让程序

调整

使其运行得非常快,这就是为什么我建议保持标准SORT。它有效并且更容易被其他人理解。

    

© www.soinside.com 2019 - 2024. All rights reserved.