地球物理测井数据格式及面向对象的数据读取解析.docx
- 文档编号:29548881
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:13
- 大小:311.60KB
地球物理测井数据格式及面向对象的数据读取解析.docx
《地球物理测井数据格式及面向对象的数据读取解析.docx》由会员分享,可在线阅读,更多相关《地球物理测井数据格式及面向对象的数据读取解析.docx(13页珍藏版)》请在冰豆网上搜索。
地球物理测井数据格式及面向对象的数据读取解析
第29卷第2期物 探 与 化 探
Vol.29,No.2 2005年4月
GEOPHYSICAL&GEOCHEMICALEXPLORATION
Apr.,2005
地球物理测井数据格式及面向对象的数据读取
李河,王祝文,李舟波,丁永浩
(吉林大学地球探测科学与技术学院,吉林长春 130026
摘要:
在进行地球物理测井数据处理或解释软件开发时,,取、格式转换、数据处理以及绘图等工作。
在对ECLIPS5700,基于内存映射文件技术,采用面向对象的方法创建了XTF文件数据的快速读取,也关键词:
地球物理测井;中图分类号:
:
A 文章编号:
1000-8918(200502-0174-05
时,了解测井数据文件的记录格式非常重要,只有知道所处理的测井数据的格式,才能正确地进行数据
的读取、格式转换、数据处理以及绘图等工作[1-3]
。
我们在开发GeoWell测井解释系统时,要处理ECLIPS5700数控测井系统XTF格式文件。
当测量井段很深时,数据量一般比较大,如果XTF文件中含有各类成像测井数据,数据量就更大,会出现数据读取和处理速度慢、内存不足等问题,因此,需要研究XTF文件的格式,研究快速读取数据的技术,来解决上述这些问题。
1 XTF文件格式分析
ECLIPS5700数控测井系统在国内各油田使用
较为广泛。
虽然ECLIPS5700操作手册中提供了关于XTF文件的数据格式说明,但是许多关键参数的
说明并不清楚,对数据块的存放也没有提及[4]
这就使得直接对XTF格式文件进行数据处理和格式转换等工作无法正常进行。
因此,有必要对XTF文件的格式进行详细分析,以实现与其它测井系统之间数据文件的相互转换或对XTF文件直接进行处理。
1.1 XTF文件结构
XTF文件包含的信息量很大。
它由标题块和数
据块组成,最小的组成单元是记录,每个记录的长度均为4096字节。
标题块通常包括8个记录,数据块包含的记录个数由曲线的深度范围、曲线类型及
曲线的数据类型等决定[4-5]
。
XTF文件允许不同特性的曲线并存,如曲线的起始深度、结束深度、采样率、曲线类型等都可以不同。
XTF文件的标题块后紧跟数据块,数据块用于存放XTF文件的数据。
XTF文件整体结构如图1所示
。
图1 XTF格式文件结构
1.2 XTF文件的标题信息
XTF文件的标题块用于记录文件名、油公司名、
井名、井场信息及曲线的特性等信息。
在结构上,包括8个记录:
(1标题记录1,主要包括文件名、系统码、曲线条数等信息。
(2标题记录2,是关于文件存储的信息,它用来指示不使用或被删除的区域。
(3标题记录3,存放XTF文件中的曲线名,每条曲线的名字最多8个字符。
收稿日期:
2004-12-10
基金项目:
国家自然科学基金"九五"重大项目和大庆石油管理局联合资助项目(49894190-42;
国家“九五”重大科学工程“中国大陆科学钻探工程”
资助项目
2期李河等:
地球物理测井数据格式及面向对象的数据读取 (4标题记录4,记录标题记录3中所包含的曲线数据块的起始位置和采样点数,共512条曲线交错排放,顺序为曲线1、曲线257,曲线2、曲线258,……,曲线256、曲线512。
(5标题记录5,包含了曲线的维数及每一维所包含的元素数。
XTF文件中维数定义为1、2、3,存放顺序与标题记录4基本相同。
曲线类型1,即CONV曲线,第1维包含的元素数为1,第2、3维包含的元素数都为0;曲线类型2,即1维WAVEFORM曲线,第1维包含的元素数为波列的采样点数,第2、3维包含的元素数都为0;曲线类型3,即2维RAY曲线,第3维包含的元素数为0。
(6标题记录6,结束深度,(7、曲线类型、、水平及垂直特性。
XTF文件曲线类型有3种:
常规曲线(CONV=1,波列曲线(WAVEFORM=2,阵列曲线(ARRAY=3。
XTF文件数据类型主要有:
BIT、INT32、UBYT、RL34、I12S、I12U、CHAR、RL38、USHR、INT34、ULON。
(8标题记录8,记录油公司及井场信息等。
1.3 XTF文件的数据块
XTF文件的标题块后紧跟数据块,数据块用于
存放XTF文件的数据。
每条曲线的数据都包括两部分:
曲线头记录(4096字节和数据记录(其长度根据每条曲线的起始深度、结束深度、采样率、曲线类型、数据类型等确定。
(1曲线头信息:
记录每条曲线本身的信息,包括曲线名、起始和结束深度、采样率、维数等,有些内容与标题块中的相同。
(2数据记录:
存放曲线的数据,如果曲线的字节数不是4096的整数倍,那么不够4096的根据需要用0或其它值补齐。
这里需要说明一下,XTF文件8个标题记录和曲线头记录都包含有很多信息,由于篇幅所限,这里无法详细列出,可以查询参考文献[4-5]。
2 实现大数据量快速读取的面向对象方法
我们讨论的是基于内存映射文件技术,实现大数据量XTF文件快速读取的面向对象方法。
在对数据进行处理或绘图时,最常用的方法是定义数组来临时保存数据。
但是当数据量很大时,要想一次读取所有数据,数组也必须定义得很大,这样就会发生内存不足的问题,如果用传统的通过I/O文件读取技术进行数据读取的方式,会因为数据量大,速度
慢,不能满足要求。
在对XTF文件格式分析的基础上,基于内存映射文件技术,采用面向对象的方法实现了大数据量XTF文件数据的快速读取。
2.1 内存映射文件的工作原理
内存映射文件允许应用程序与通过指针访问动态内存相同的方式访问磁盘上的文件。
因此,可以在进程地址空间中将磁盘上的文件部分或者全部映射到特定地址范围,,,就像3种情况[6-7]
:
①可执行文件的内存映射,主要由操作系统自身使用;②数据文件的内存映射;③借助于系统页面交换文件的共享内存映射。
应用程序可以使用后面2种内存映射文件。
系统在进行工作时,首先把数据文件的一部分映射到虚拟地址空间内,但不提交RAM。
存取这段内存指令时会产生一个页面异常,系统捕获到这个异常后,分配一页RAM,并把它映射到当前进程发生异常的地址处,然后系统把文件中相应的数据读到这个页面中,继续执行刚才产生异常的指令。
这就是应用程序自己不需要调用文件I/O函数的原因,也是内存映射文件技术的工作机理。
使用内存映射文件的一般步骤如下:
(1调用CreateFile函数,以适当的方式创建或打开一个文件核心对象。
(2把CreateFile函数返回的文件句柄作为参数传给CreateFileMapping函数,CreateFileMapping函数创建1个文件映射核心对象的适当属性。
(3调用MapViewOfFile函数,将整个文件的部分或全部映射到内存。
(4利用MapViewOfFile函数返回的指针来读写文件数据。
(5用UnMapViewOfFile函数撤销对文件映射核心对象的映射。
(6使用CloseHandle函数关闭文件映射核心对象。
(7用CloseHandle函数关闭文件核心对象。
2.2 文件快速读取的设计实现
在从XTF格式文件获取数据进行处理或绘图时,可能会遇到大数据量数据读取问题。
例如:
要读取声电成像测井数据进行处理并绘图,数据量很大,特别是当绘制多道成像测井图像时,数据量更大。
实际开发中,基于内存映射文件技术,采用面向对象的方法,设计了数据读取类,能够快速方便地读取当
・
571
・
物 探 与 化 探29卷
前打开井的任意深度段的曲线数据。
面向对象程序设计方法已成为程序设计的主流
方向,是现代软件开发的主要方法[8-9]
。
面向对象方法,由于程序具有封装性、继承性和多态性等优点,可以提高软件的可扩充性和可重用性。
采用面向对象方法设计XTF格式文件数据读取类,把内存影射文件的使用封装在类的相应函数中,使用时灵活方便。
设计中,与XTF文件8个标题记录对应设计8个结构,与XTF文件曲线头信息对应也设计了结构,内存映射文件前面3个步骤最终把要处理的XTF文件映射到内存,数中;内存映射文件最后3,;,样简单,足、。
篇幅所限,这里只给出类的主要部分。
classCPlotDataFileObject:
publicCObject{
public:
CPlotDataFileObject(;virtual~CPlotDataFileObject(;public:
BOOLOpenDataFile(;//打开XTF格式文件BOOLCloseDataFile(;//关闭XTF格式文件private:
CStringm_DataFilePathName;//文件路径名称HANDLEm_hFile;//文件句柄HANDLEm_hMap;//文件映射句柄
LPVOIDm_lpvFile;//文件映射地址空间首地址//XTF文件8个标题记录,//XTF_HEAD1~8为结构XTF_HEAD1m_XTF_Head1;XTF_HEAD2m_XTF_Head2;XTF_HEAD3m_XTF_Head3;XTF_HEAD4m_XTF_Head4;XTF_HEAD5m_XTF_Head5;XTF_HEAD6m_XTF_Head6;XTF_HEAD7m_XTF_Head7;XTF_HEAD8m_XTF_Head8;//XTF文件各条曲线头记录,//XTF_CURVEHEAD为结构
XTF_CURVEHEAD3m_pXTF_CurveHead;public:
double3m_DataBuff;//临时存放当前读取数据
//操作的结果
//临时存放当前读取数据操作的深度点数,与//用户选择的深度范围有关intm_DepthNum;
/3临时存放当前读取数据操作返回的数据数
目,与用户选择的深度范围有关,当曲线为CONV类型时,与m_DepthNum相同;当为WAVE或MATRIX型时,与m_DepthNum不同,m_Depth2Num_DataBuff取得数据3/
//判断是否是XTF格式的文件BOOLIsXTFFormatFile(;//读8个标题记录
BOOLReadXTF8Head(;//读各条曲线头记录BOOLReadXTFCurveHead(;
/3m_DataBuff和m_DepthNum及m_DataNum
存放执行结果,m_DepthNum是深度点数目,第一种
类型曲线,就是数据数目,第二种类型曲线和第三种类型曲线,虽然m_DataBuff是一维数组,但仍可根据曲线的类型取出正确的数据3/
BOOLReadXTFAnyTypeCurveData(floatUser2 ChoseStartDep,floatUserChoseEndDep,int CurveInDataFileIndex;
//每次读完数据后,如果读到了数据且使用完毕,可以用此函数释放内存
voidClearDataBuff(;private:
/3在用户选择的深度范围内曲线数据最多可能由3部分构成,但最多只有一部分是来自原来曲线,而其他部分则超出实际测量范围而数据为空。
下面函数计算在所给的采样间隔内各部分的数据量,确切地说是深度点数,对于wave和matrix型应该根据各维的数据个数进行存取,函数中的指针分别为:
第一部分点数、第二部分点数、第三部分点数、第二部分的起始位置。
前5个为输入参数,后4个为输出参数,其中深度点索引从1开始3/
BOOLCalculate4VarNum(floatUserChoseStartDep, floatUserChoseEndDep,floatRealStartDep,float RealEndDep,floatRLevel,int3FirstDepNum, int3SecondDepNum,int3ThirdDepNum, int3SecondFromNum;
/3读取相应类型给定数量的数据,并放入缓冲区,使用时注意先分配缓冲区的大小,当计算好Da2
・671
・
2期李河等:
地球物理测井数据格式及面向对象的数据读取图2 XTF格式文件数据读取类使用步骤
taNum再分配Buff的大小,常规、波列和阵列数据都
可用此函数读取,从给定位置开始读取给定类型的数据,并转为double型后输出3/
BOOLReadXTFCurveData(float3Buff,doubleOut2 Array[],intFromPosition,intArraySize;
BOOLReadXTFCurveData( OutArray[],intFroon,BOOL(int3Buff,double OutArray[intomPosition,intArraySize;BOOLReadXTFCurveData(longint3Buff,double OutArray[],intFromPosition,intArraySize;};
特别说明:
ReadXTFCurveAnyTypeData调用了Calculate4VarNum和ReadXTFCurveData成员函数。
文件映射的前3步封装在OpenDataFile(中,文件映射的后3步封装在CloseDataFile(中。
一般使用步骤见图2。
2.3 数据读取示例
目前,具体如何使用内存映射文件的介绍并不多见。
这里举一个具体例子:
假设文件已经映射到内存,需要读取XTF文件标题信息,具体如下:
BOOLCPlotDataFileObject:
:
ReadXTF8Head({
intTempFromPosition;//指定要读取数据在文件//中的起始位置TempFromPosition=0;
XTF_HEAD13TempXTF_Head1;//XTF_HEAD1//为XTF文件第一个标题记录结构
/3读第一个文件头标题记录,m_lpvFile为Map2ViewOfFile(的返回值,这里指经过内存映射的XTF
文件3/
TempXTF_Head1=(XTF_HEAD13((char3 m_lpvFile+TempFromPosition;m_XTF_Head1=3TempXTF_Head1;
TempFromPosition+=XTF_RECORDLENGTH;//下一个文件头标题记录的开始位置//读第二个文件头标题记录
XTF_HEAD23TempXTF_Head2;
TempXTF_Head2=(XTF_HEAD23((char3
m_lpvFile+TempFromPosition;m_XTF_Head2=3Te……
}
当进行了内存映射后,读取数据是非常快速和方便的,不需要考虑更多细节,就象使用数组一样简单。
3 结论
测井资料解释处理工作中,XTF、LIS和DLIS等格式文件是常见的,文件格式分析非常重要。
目前,针对大数据量XTF格式文件数据读取方法研究的文献并不多见,笔者在分析了XTF文件格式的基础上,基于内存映射文件技术,采用面向对象的方法,设计实现了大数据量XTF格式文件的数据读取类,并实际应用于测井资料解释系统GeoWell中,解决了绘图和数据处理中的速度慢和内存不足以及程序运行效率低等问题,也为测井软件中经常遇到的数据格式转换提供了技术参考。
参考文献
[1] 牛虎林,吴锡令.多相流动测井数据的预处理方法及软件研制
[J].物探与化探,2004,28(1:
59-61.
[2] 胡佳庆.测井数据常用格式及格式转换[J].海洋石油,2003,
23(1:
75-80.
[3] 刘浩军,薛典军,郭志宏,等.航空物探软件系统研制[J].物探
与化探,2003,27(2:
146-149.
[4] 马玲华,杨劲松,李传伟,等.ECLIPS5700测井系统XTF文件
格式分析[J].测井技术,2001,25(3:
225-230.
[5] WesternAtlasInternationalInc.XTFSurveyFileFormat.1994,2
-28.
[6] 杨宁学,诸昌钤,聂爱丽.内存映射文件及其在大数据量文件快
速存取中的应用[J].计算机应用研究,2004,(8:
187-188.
[7] 魏代永,郝向阳,巩学美.地图矢量数据计算机内存管理方法
[J].解放军测绘学院学报,1999,16(2:
109-112.
[8] 杨冰,聂雪.面向对象的开发方法[J].西安联合大学学报,
2004,7(2:
57-60.
[9] 朱政,刘仁义,刘南.Img图像数据格式分析及超大数据量快速
读取方法[J].计算机应用研究,2003,(8:
60-61.
・
771
・
物 探 与 化 探29卷
THEGEOPHYSICALWELLLOGGINGFILEFORMATANDTHEDATAREADING
TECHNIQUEBASEDONTHEOBJECT2ORIENTEDMETHOD
LIHe,WANGZhu2wen,LIZhou2bo,DINGYong2hao
(CollegeofGeoExplorationScience&Technology,Changchun 130026,China
Abstract:
Inthecourseofprocessinggeophysicalwellloggingdataordevelopingwelllogginginterpretationsoftware,itisimportanttoknowtheformatofwellloggingdatafile.Inunderstandingtheformatofwellloggingdatatobeprocessed,workcanbedone,suchasreadingdata,transformingdataformat,processingdataandplotting.OntheofformatofECLIPS5700wellloggingsystem,aclassofreadingXTFformatdatawasbuiltwith2morymappingfiletechnique.ThistechniquerealizesfastreadingofXTFformatfileandortechnicalreferenceforformattransformationanddataprocessingofotherwellloggingdataKeywords:
geophysicalwelllfilemat;memorymappingfile
作者简介:
李河(,,,主要从事地球物理测井软件开发、科学计算可。
・871
・
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 地球物理 测井 数据格式 面向 对象 数据 读取 解析
![提示](https://static.bdocx.com/images/bang_tan.gif)