1.ISAM文件

索引顺序存取方法ISAM 为Indexed Sequential Access Methed的缩写,它是一种专为磁盘存取设计的文件组织方式。由于磁盘是以盘组,柱面和磁道三级地址存取的设备,则可对磁盘上的数据文件建立盘组、柱面和磁道R三级索引。文件的记录在同一盘组上存放时,应先集中放在一个柱面上,然后再顺序存放在相邻的柱面上,对同一柱面,则应按盘面的次序顺序存放。例如图1为存放在一个磁盘组上的ISAM文件,每个柱面建立一个磁道索引,每个磁道索引项由两部分组成:基本索引项和溢出索引项,如图2所示,每一部分都包括关键字和指针两项,前者表示该磁道中最末一个记录的关键字(在此为最大关键字),后者指示该磁道中第一个记录的位置,柱面索引的每一个索引项也由关键字和指针两部分组成,前者表示该柱面中最末一个记录的关键字(最大关键字),后者指示该柱面上的磁道索引位置。柱面索引存放在某个柱面上,若柱面索引较大,占多个磁道时,则可建立柱面索引的索引一主索引。

在ISAM文件上检索记录时,先从主索引出发找到相应的柱面索引,再从柱面索引找到记录所在柱面的磁道索引,最后从磁道索引找到记录所在磁道的第一个记录的位置,由此出发在该磁道上进行顺序查找直至找到为止;反之,若找遍该磁道而不存在此记录,则表明该文件中无此记录。例如,查找关键字为21的记录时的查找路径如图1中的粗实线所示。

图1 ISAM文件结构示例

​        从图1中可看到,每个柱面上还开辟有一个溢出区;并且,磁道索引项中有溢出索引项,这是为插入记录所设置的。由于ISAM文件中记录是按关键字顺序存放的,则在插入记录时需移动记录,并将同一磁道上最末一个记录移至溢出区,同时修改磁道索引项。通常溢出区可有3种设置方法:(1)集中存放——整个文件设一个大的单一的溢出区;(2)分散存放——每个柱面设一个溢出区;(3)集中与分散相结合—溢出时记录先移至每个柱面各自的溢出区,待满之后再使用公共溢出区。图1是第二种设置法。

图2 磁道索引项结构

每个柱面的基本区是顺序存储结构,而溢出区是链表结构。同一磁道溢出的记录由指针相链,该磁道索引的溢出索引项中的关键字指示该磁道溢出的记录的最大关键字;而指针则指示在溢出区中的第一个记录。图3所示为插入记录和溢出处理的具体例子。其中(a)为插人前的某一柱面上的状态;(b)为插入 时,将第二道中关键字大于65的记录顺次后移,且使 溢出至溢出区的情况;(c)为插入 之后的状态,此时2道的基本索引项的关键字改为80,且溢出索引项的关键字改为90,其指针指向第4道第一个记录即 ;(d)是相继插入后的状态, 插入在第3道的第一个记录的位置而使溢出。而由于80<83≤90,则Rss被直接插入到溢出区,作为第⒉道在溢出区的第一个记录,并将它的指针指向Rz的位置,同时修改第⒉道索引的溢出索引项的指针指向

图3 ISAM文件的插入和溢出处理 (a)插入前;(b)插入R65时记录移动的情形;(c)插入R65后;(d)先插入R95再插入R83后

ISAM文件中删除记录的操作要比插人简单得多,只需找到待删除的记录,在其存储位置上作删除标记即可,而不需要移动记录或改变指针,但在经过多次的增删后,文件的结构可能变得很不合理。此时,大量的记录进入溢出区,而基本区中又浪费很多空间。因此,通常需要周期地整理ISAM文件。把记录读入内存,重新排列,复制成一个新的ISAM文件,填满基本区而空出溢出区。

通常,磁道索引放在每个柱面的第一道上,那么,柱面索引是否也放在文件的第一个柱面上呢?由于每一次检索都需先查找柱面索引,则磁头需在各柱面间来回移动,我们希望磁头移动距离的平均值最小。假设文件占有n个柱面,柱面索引在第α柱面上。则磁头移动距离的平均值为:

 ,得到x= 。这就是说,柱面索引应放在数据文件的中间位置的柱面上。

2. VSAM文件

虚拟存储存取方法VSAM是Virtual Storage Access Method 的缩写。这种存取方法利用了操作系统的虚拟存储器的功能,给用户提供方便。对用户来说,文件只有控制区间和控制区域等逻辑存储单位,与外存储器中柱面、磁道等具体存储单位没有必然的联系。用户在存取文件中的记录时,不需要考虑这个记录的当前位置是否在内存,也不需要考虑何时执行对外存进行“读/写”的指令。

VSAM文件的结构如图4所示。它由3部分组成:索引集、顺序集和数据集。

图4 VSAM文件的结构示意图

​        文件的记录均存放在数据集中,数据集中的一个结点称为控制区间(Control Interval),它是一个I/O操作的基本单位,它由一组连续的存储单元组成。控制区间的大小可随文件不同而不同,但同--文件上控制区间的大小相同。每个控制区间含有一个或多个按关键字递增有序排列的记录。顺序集和索引集一起构成一棵B+树,为文件的索引部分。顺序集中存放每个控制区间的索引项。每个控制区间的索引项由两部分信息组成,即该控制区间中的最大关键字和指向控制区间的指针。若干相邻控制区间的索引项形成顺序集中的一个结点,结点之间用指针相链结,而每个结点又在其上一层的结点中建有索引,且逐层向上建立索引。所有的索引项都由最大关键字和指针两部分信息组成,这些高层的索引项形成B+树的非终端结点。因此,VSAM文件既可在顺序集中进行顺序存取,又可从最高层的索引(B+树的根结点)出发进行按关键字存取。顺序集中一个结点连同其对应的所有控制区间形成一个整体,称做控制区域(Control Range)。每个控制区间可视为一个逻辑磁道,而每个控制区域可视为一个逻辑柱面。

在VSAM文件中,记录可以是不定长的,则在控制区间中除了存放记录本身以外,还有每个记录的控制信息(如记录的长度等)和整个区间的控制信息(如区间中存有的记录数等),控制区间的结构如图5所示。在控制区间上存取一个记录时需从控制区间的两端出发同时向中间扫描。

图5 控制区间的结构示意图

​        VSAM文件中没有溢出区,解决插人的办法是在初建文件时留有空间。一是每个控制区间内不填满记录,在最末一个记录和控制信息之间留有空隙;二是在每个控制区域中有一些完全空的控制区间,并在顺序集的索引中指明这些空区间。当插入新记录时,大多数的新记录能插入到相应的控制区间内,但要注意为了保持区间内记录的关键字自小至大有序,则需将区间内关键字大于插入记录关键字的记录向控制信息的方向移动。若在若干记录插入之后控制区间已满,则在下一个记录插人时要进行控制区间的分裂,即将近乎一半的记录移到同一控制区域中全空的控制区间中,并修改顺序集中相应索引。倘若控制区域中已经没有全空的控制区间,则要进行控制区域的分裂,此时顺序集中的结点亦要分裂,由此尚需修改索引集中的结点信息。但由于控制区域较大,很少发生分裂的情况。

在VSAM文件中删除记录时,需将同一控制区间中较删除记录关键字大的记录向前移动,把空间留给以后插入的新记录。若整个控制区间变空,则需修改顺序集中相应的索引项。

由此可见,VSAM文件占有较多的存储空间,一般只能保持约75%的存储空间利用率。但它的优点是:动态地分配和释放存储空间,不需要对文件进行重组,并能较快地对插人的记录进行查找,查找一个后插人记录的时间与查找一个原有记录的时间是相同的。

为了作性能上的优化,VSAM用了一些其他的技术,如指针和关键字的压缩、索引的存放处理等。

然后今天就讲到这里啦,大家记得点赞收藏,分享转发,关注小哥哥哦! 最后,如果你想学或者正在学C/C++编程,可以加入小编的编程学习C/C++企鹅圈https://jq.qq.com/?_wv=1027&k=vLNylJeG

数据结构之ISAM文件和VSAM文件相关推荐

  1. c语言二叉树的头文件叫什么,西安交大朱站立数据结构——使用C语言》头文件系列——二叉树.doc...

    西安交大朱站立数据结构--使用C语言>头文件系列--二叉树 本文为二叉链存储结构的二叉树操作实现,实现了二叉树的定义.插入数据.删除数据.撤销以及二叉树的打印.前序遍历.中序遍历.后序遍历等.本 ...

  2. 图书馆管理系统(C、数据结构、哈希表、文件IO)

    目录 技术路线 实现效果展示 ​程序主体 1.头文件部分 2.自定义函数定义部分 3.main函数部分 注意 技术路线 数据结构.哈希表.文件IO 通过C语言进行程序设计,有用到数据结构中的哈希表,通 ...

  3. 12.4.2 虚拟存取方法文件 / VSAM文件

    虚拟存储存取文件 / VSAM 文件 文件只有 控制区间 和 控制区域 等逻辑存储单位: 与外存储器中柱面.磁道等具体存储单位没有必然的联系,用户在存取文件中的记录时,不需要考虑这个记录的当前位置是否 ...

  4. 定义VSAM文件-IDCAMS

    定义VSAM文件-IDCAMS //F49DEFVS JOB CLASS=A,MSGCLASS=H,MSGLEVEL=(1,1),NOTIFY=&SYSUID //FORM49VS EXEC ...

  5. 【Informatica PWC】如何利用copybook导入cobol,vsam文件

    cobol系统导出的数据集通常为vsam文件,无法用普通工具直接打开查看, 为cobol文件创建源(source)时不能通过普通文件(flat file)的方式直接导入. 需要借助cobol文件格式描 ...

  6. 按照某个VSAM文件去定义新的VSAM文件

    按照某个VSAM文件去定义新的VSAM文件 //DEFVSAM EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * DELETE FORM52.UT ...

  7. BUAA数据结构作业——基于Huffman码的文件压缩工具

    目录 前言 题目 问题描述 输入形式 输出形式 样例 问题分析 代码实现 前言 大家好哇!今天给大家分享一道Huffman码的实战应用题.Huffman码来源于Huffman树,假设二叉树有m个叶结点 ...

  8. linux文件 i节点结构,Linux 文件描述符 文件表项 i节点结构

    Linux的VFS(虚拟文件系统)学习起来很痛苦,看源码不太明智,看完分析完就忘且太浪费时间,懂了后也无法应用在实际场合中.所以这里只是讨论下文件描述符,文件表项(file结构体)和inode,理清实 ...

  9. Python读取.set文件和.locs文件

    本案例主要介绍如何读取eeglab示例文件.set以及.locs文件. .set文件记录的是采集的信息,主要内容包括通道数,事件数,开始时间与结束时间等. .locs文件记录的是电极位置信息. 知识点 ...

最新文章

  1. ReSharper 配置及用法
  2. 开发chrome 插件, background.js中 console log 看不到解决方法
  3. java date 格式化_3种 Springboot 全局时间格式化方式,别再写重复代码了
  4. JavaWeb黑马旅游网-学习笔记05【分类数据展示功能】
  5. 162. Find Peak Element
  6. 转:Socket在阻塞模式下的信息收发和文件接收
  7. 使用base64 对Json 的返回数据进行优化
  8. AI风向标:发改委重大工程项目公布,首个无人车路测试点落户亦庄
  9. Linux常用的网络命令
  10. python中arcsec_python – 更好的方法来计算Skyfield中两个物体的明显角度分离?
  11. 编程界的十大天神,都来拜一拜吧
  12. Fork\Join分而治之--RecursiveTask和RecursiveAction(一)
  13. 湖北武汉安全员C证报考条件考试流程一览 秋禾火
  14. Loadrunner11破解详解 .
  15. 网络流量监测技术概述
  16. 1.5 日本の会社で働くのは、初めてなので、不安です
  17. Python地学分析 — GDAL对遥感影像重投影
  18. 多渔:所有命运馈赠的礼物,早已在暗中标注好了价格
  19. 月经贴--2012-8月-9月总结
  20. 堆叠泛化(Stacking Generalization)

热门文章

  1. Tita:2021年的绩效考核(上)
  2. SQL的语法与分类,语法示例+图片,贼吉尔详细!!!
  3. JAVA图形面积与周长(抽象类)
  4. The Tao of Programming
  5. 超级计算机预测2月有雪寒潮,科学网—被证实的预测:寒潮影响马上结束,倒春寒要退场了! - 杨学祥的博文...
  6. unity虚拟仿真PC端需要掌握的技术
  7. HTML5期末大作业:饮食食品主题设计——绿色简洁生鲜超市网站设计(5页) HTML+CSS+JavaScript web前端大二实训大作业
  8. c语言循环题兔子第三个月生,C语言·古典问题: 兔子总数
  9. python电路仿真_蔡氏电路仿真实验
  10. 音频信息隐藏技术研究