我有一个可能包含300万条记录的文件。此文件的某些记录需要在整个程序运行过程中多次更新。如果我需要从这个文件中提取特定的记录,那么以下哪一项更有效:
发布于 2016-06-24 17:13:24
显然,如果您可以将所有的数据缓冲到内存中(如果主机系统能够支持一组足够大的工作页面,允许所有这些页面在不分页的情况下实际保留在RAM中),那么这可能是最快的方法。
但是,要非常小心地考虑由虚拟内存分页子系统引起的“隐藏磁盘I/O”!如果请求的“内存中”数据实际上不是“内存中的”,则会发生页面错误,并且您的进程将停止跟踪,直到页面被检索为止。(如果“偷页”发生,那么你就有麻烦了。你的“内存中”策略变成了一种可能非常低效的策略(!)以磁盘为基础。如果密钥是随机分布的,那么您的进程有一个庞大的工作集,它是随机访问的。如果所有该内存的实际上不在内存中,并且将停留在内存中,那么您就有麻烦了。
如果您正在对一个大型文件进行更新,请考虑在处理该文件之前对更新-增量文件进行排序,以便所有出现的相同密钥都将相邻。现在您可以编写COBOL程序来利用这一点(当然,如果检测到异常记录,也可以编写到abend!)如果“此”记录中的键与“前一个”的键相同,则不需要重新读取该记录。(而且,在键改变之前,您实际上不需要写入旧记录。)由于索引文件访问方法具有一系列的密钥,因此每个键很可能“接近”先前请求的键,因此一些必要的索引树页面已经在内存中。显然,您需要对此进行基准测试,但是排序文件所花费的时间远远少于索引查找所花费的时间。(这实际上是相当可观的。)
发布于 2016-06-24 19:37:29
Mike的回答有一个重要的问题:“隐藏I/O”(取决于机器、配置、数据量)。
如果您很可能需要更新许多记录,则Mike建议的选项是最有用的。
如果您很可能需要更新的记录不多(我猜您可能低于2%),那么另一种方法可能会更快(需要一个基准!):
REWRITE。REQRITE所有记录(如果您有完整的记录一个REWRITE就足够了,否则您首先需要一个READ才能得到完整的记录)性能通常是:“了解您的数据和可能的程序流程,然后尝试最好的2-3方法,基准和决定”。
https://stackoverflow.com/questions/38018609
复制相似问题