DLIS和WIS格式解编

更新时间:2024-04-20 作者:用户投稿原创标记本站原创 点赞:29512 浏览:140292

[摘 要]石油行业内的测量数据格式千差万别,本文将介绍美国石油协会通过,由斯伦贝谢公司提供设计方案的数据记录格式DLIS文件格式的解编,同时为了软件模块的实用性,对FORWARD软件使用的1.0版本的WIS文本格式也进行了解编,使得DLIS、WIS和WIL(解编模块内部格式)实现自由转换.


[关 键 词 ]DLIS 数据格式 记录 WIS

中图分类号:N37 文献标识码:A 文章编号:1009-914X(2014)44-0220-01

1.引言

在我国石油测井系统中,随着测井技术与计算机技术的飞速发展,各种新测井仪器和新解释方法的应用,产生了大量的测井信息[1],为满足数据读取、处理、保存的方便的需求,大量的数据记录技术被设计出来,以便满足用户希望获得记录完整信息的需求.这些促使一种更高效和更加规范的数据记录格式的出现即 Digital Log Interchange Standard (DLIS)[2],本文将介绍一下解编过程中用到的内存映射、单文档多窗体技术等关键技术,与大家一起学习交流.

2.DLIS格式说明

Dlis格式从逻辑上讲分为若干个记录,每个记录由多个字节组成,每个字节包含8位,如图1所示;从物理格式上讲整个文件内容依次是SUL(Storage Unit Label 存储单元标签),若干个逻辑文件,每个逻辑文件由若干个可视记录组成如图2所示.文件的记录分为直接记录和间接记录两部分,直接记录指不需要参考其他信息就能比较完整表达自身含义的记录,直接记录里主要存放该数据的参数信息,例如数据测量公司、测量时间、测量仪器以及测量曲线的单位、采样间隔等等描述性的信息.间接记录里主要存放的是测量的具体数据,这些数据必须参考前面的直接记录信息才能确定其具体的含义.

在具体实现的过程中,由于DLIS里的数据采用的是反码技术,并且最高位是数据的结构信息,不参与对应的数据的数值计算,所以在读取和保存数据时要编写好相应的转码函数.该数据存储的好处是可以根据数据的值自动判断用多小个字节来存储,避免了整形数据都使用四个字节或者八个字节,或者浮点型数据都用四个或者八个而造成的存储空间浪费,最大限度的利用了存储空间,由于成像测井相对于常规测井数据量比较大的特点,该记录方式可以明显的减少对硬盘存储单元的使用.该存数方式不利的地方是增加了数据读写的运算量,但是由于现在计算机硬件的配置已经很高,额外的运算量并不会明显影响解编模块的快速运行.

由于Dlis格式文件里存放了大量不同类型的信息,在本解编模块将从文件里读取的各种信息分类保存在不同类型的链表里面.存放在链表里面的优点是逻辑结构比较清晰,对数据的修改、增加、删除等操作比较方便,缺点是没有数组访问速度快,但是速度的差异是微乎其微的,综合考虑还是链表方式在内存中存放和操作数据比较合理.

WIS文件为ASCII码记录的格式,用记事本等文本文件查看器打开即可以看到里面数据的具体存放形式.

更多关于Dlis格式的细节大家请参考 POSC RP66 V1,该文章详细说明了目前已有的两个Dlis版本的格式信息.

3.内存映射技术

内存映射文件是由一个文件到一块内存的映射,使进程虚拟地址空间的某个区域与磁盘上某个文件的部分或全部内容的建立映射.

建立映射后,通过该区域可以直接对被映射的磁盘文件进行访问.而不必执行文件I/O操作也无需对文件内容进行缓冲处理.

就好像整个被映射的文件都加载到了内存一样,因此内存文件映射非常适合于用来管理大文件.

成像测井数据由于采样间隔比较小,一般为0.00254米,每个采样深度采样数据个数也比较多,一般的斯伦贝谢的FMI仪器为196个,中海油的EMI为150个,所以成像测井数据相对于常规测井数据,数据量非常大,如果采用传统的读写模式会明显感觉到速度较慢,尤其是在现场使用相关软件的情况下,速度慢会极大的降低软件或者相应模块被使用的可能性.采用内存映射的读取方式,1.73GHz,1G内存的计算机上,读取600米的成像数据和相应常规数据,大概需要12秒,而采用常规读取模式大概需要30秒.

无论是C++还C#都提供了内存映射的接口,具体实现参考百度文库等网络资源内文章即可.

4.单文档多窗体技术管理与信息显示

为了有效整合所编写的解编模块,组成一个相对完整独立的小软件,采用了单文档多窗体技术来管理软件界面即分割视图技术.该技术是在同一个框架窗口下同时显示多个视图的一项技术,使用分割视图,可以在较短时间内给用户更多的信息量,响应一些复杂的操作,增强了软件的可操作性.

在VC6.0中需要使用到CSplitterWnd类.每个窗口都被相同的或者不同的视图所填充.当窗口被切分后用户可以使用鼠标移动切分条来调整窗口的相对尺寸.将窗口分成三个视图,左上视图基于CTreeView类,用来显示文件内的框架和曲线信息,响应一些对该文件数据的操作;右上视图基于CScrollView类,是结构信息和数据的主要显示区,主要用来显示用户想要查看的内容;下方视图基于CEditView类,主要显示系统的运行信息.

用下面的方法可以获得分割窗体内的视图句柄,从而进行数据的传递,以CMyInfoView为例:

//获得指向框架对象的指针

CMainFrame *p_MainFrm 等于 (CMainFrame *)AfxGetApp()->GetMainWnd();

//获得指向分割后窗体的指句柄(指针)

CWnd *p_Wnd 等于 p_MainFrm->m_wndSplitter.GetPane(1,0);

//获得指向相应窗体内填充的视图类的句柄(指针)

CMyInfoView* pInfoview 等于 DYNAMIC_DOWNCAST(CMyInfoView,p_Wnd);

5.结论

本解编模块的数据和斯伦贝谢公司的软件对比完全一致,充分证明了解编的正确性,同时还利用了内存映射技术提高了数据的读写速度,在数据显示方面使用了单文档多窗体分割技术,在一个界面内为用户提供了更多的信息量,增强了软件的可操作性.