首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VSAM搜索与COBOL搜索/循环

VSAM搜索与COBOL搜索/循环
EN

Stack Overflow用户
提问于 2016-06-24 16:59:17
回答 2查看 664关注 0票数 0

我有一个可能包含300万条记录的文件。此文件的某些记录需要在整个程序运行过程中多次更新。如果我需要从这个文件中提取特定的记录,那么以下哪一项更有效:

  1. 索引VSAM搜索
  2. 带有COBOL搜索all的索引平面文件
  3. 将所有数据缓冲到工作存储中,并编写一个循环来处理搜索。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-24 17:13:24

显然,如果您可以将所有的数据缓冲到内存中(如果主机系统能够支持一组足够大的工作页面,允许所有这些页面在不分页的情况下实际保留在RAM中),那么这可能是最快的方法。

但是,要非常小心地考虑由虚拟内存分页子系统引起的“隐藏磁盘I/O”!如果请求的“内存中”数据实际上不是“内存中的”,则会发生页面错误,并且您的进程将停止跟踪,直到页面被检索为止。(如果“偷页”发生,那么你就有麻烦了。你的“内存中”策略变成了一种可能非常低效的策略(!)以磁盘为基础。如果密钥是随机分布的,那么您的进程有一个庞大的工作集,它是随机访问的。如果所有该内存的实际上不在内存中,并且将停留在内存中,那么您就有麻烦了。

如果您正在对一个大型文件进行更新,请考虑在处理该文件之前对更新-增量文件进行排序,以便所有出现的相同密钥都将相邻。现在您可以编写COBOL程序来利用这一点(当然,如果检测到异常记录,也可以编写到abend!)如果“此”记录中的键与“前一个”的键相同,则不需要重新读取该记录。(而且,在键改变之前,您实际上不需要写入旧记录。)由于索引文件访问方法具有一系列的密钥,因此每个键很可能“接近”先前请求的键,因此一些必要的索引树页面已经在内存中。显然,您需要对此进行基准测试,但是排序文件所花费的时间远远少于索引查找所花费的时间。(这实际上是相当可观的。)

票数 5
EN

Stack Overflow用户

发布于 2016-06-24 19:37:29

Mike的回答有一个重要的问题:“隐藏I/O”(取决于机器、配置、数据量)。

如果您很可能需要更新许多记录,则Mike建议的选项是最有用的。

如果您很可能需要更新的记录不多(我猜您可能低于2%),那么另一种方法可能会更快(需要一个基准!):

  • 通过索引VSAM搜索读取每个密钥
  • 将更改的记录存储在内存中(大发生表),如果只更改某些值,而且记录相当大,则只在表中存储所有可能更改的值+键,而不需要实际的REWRITE
  • 在进行VSAM搜索之前:如果您已经读取了键,请查看发生表中的值,要么从那里获取值,要么获取一个新的
  • ..。
  • 在程序结束时:检查发生和REQRITE所有记录(如果您有完整的记录一个REWRITE就足够了,否则您首先需要一个READ才能得到完整的记录)

性能通常是:“了解您的数据和可能的程序流程,然后尝试最好的2-3方法,基准和决定”。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38018609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档