专利名称:一种地震前兆数据压缩存储与解压缩技术的制作方法
技术领域:
本发明涉及我国地震前兆采样数据在数据库中的存储方式与数据使用方法,尤其适用于对大数据量、高采样率数据在数据库中进行压缩存储与数据的解压缩提取使用。
背景技术:
目前,我国地震前兆数据库的原始数据,采集自各地震前兆观测仪器,每采样率每天累积产生一条记录,直接存放在数据库中的文本大对象字段(CL0B),使存储数据的磁盘空间迅速增长,数据保密性也较差;在使用数据时,因数据体积大,从数据库下载高采样率数据等待时间也特别长。
发明内容
为了克服现有前兆数据库中数据存储方式带来的不足,进一步降低磁盘空间占用率、提高数据下载速度、加强数据保密性,本发明提供一种对地震前兆采样数据进行压缩存储与解压缩的技术,通过利用计算机内存直接进行二进制压缩、加密,并保存到数据库的二进制大对象字段(BLOB);使用数据时,从数据库字段中取出该二进制压缩数据,通过解密、 解压缩逆运算还原原始数据。本发明解决其技术问题所采用的技术方案是根据地震前兆要保存入库的观测数据分类,分别有字符串、单精度数组、双精度数组、二进制(图片图像等)、文件,为此,压缩与解压缩的函数接口分别为字符串、单精度数组、双精度数组、二进制、文件压缩与解压缩;该技术核心是数据直接在内存操作,采用Deflate和LZ77算法改良和优化后的压缩算法思想,实现并封装成可任意自由调用的无损压缩与解压缩函数动态链接库,把要压缩的数据读入内存变量或数组,把变量或数组的数据经核心压缩算法函数压缩成二进制,最后把压缩后的二进制数据保存到数据库的BLOB字段;使用数据时,读取BLOB字段中的二进制压缩数据,通过调用动态库解压缩函数,把压缩二进制数据解压缩还原。本发明的有益效果是,通过直接将前兆原始数据压缩并以二进制形式存储到数据库BLOB字段,大大降低了数据的硬盘空间占用率,同时也起到了数据加密的作用。
图1所示为压缩后二进制数据存储结构。图1中的前4位存放压缩后数据大小。图1中第5位存放数据类型,用数字表示,0为二进制,1为文件,2为字符串,3为单精度数组,4为双精度数组。图1中第6位存放压缩方式,默认值为7。图1中第7至10位根据类型不一样,存放的值不一样,详见下面函数原型说明。图1中从第11位开始,之后存放的是实际被压缩后的二进制数组数据。图2为压缩解压缩算法动态链接库的函数接口。
图2中(6)为将字符串压缩为Binary (二进制)函数接口,其原型为
Int DataZip_StringToBinary(char ^TheInString, unsigned char ^outBin, long int *nBin)
TheInString输入字符串。nBin输入为分隔符的ASCII (空格为32,逗号为44,/为 92,分号为59,无分隔符为0);输出参数,nBin =N+10,N为压缩后的数据字节大小。outBin输出压缩后的Byte数据; 其中1-4个字节存放压缩后的数据字节大小;
第5字节存放数据类型,字符串为2 ; 第6字节为压缩方式,默认方式为7 ; 第7字节分隔符; 第8、9、10字节为空,用O表示。DataZip_StringToBinary 成功为 O,不成功为 1。图2中(11)为解压缩字符串(double、single这两种Byte数据,以空格为分隔输出字符串,其它直接解压输出字符串)函数接口,其原型为
Int DataZip_BinaryToString(char ^TheOutString, unsigned char ^inBin, long int 氺outnBin)
TheOutString输出字符串。outnBin输出参数,outnBin =N+10,N为解压缩后的数据字节大小。inBin输入待解压的Byte数据; 其中1-4个字节存放压缩后的数据字节大小;
第5字节存放数据类型,字符串为2 ; 第6字节为压缩方式,默认方式为7 ; 第7字节分隔符; 第8、9、10字节为空,用O表示。DataZip_StringToBinary 成功 O,不成功为 1。 图2中(7)为将Single压缩为Binary (二进制)函数接口,其原型为
Int DataZip_SingleToBinary (float ^ArrayName, long int N, unsigned char ^outBin, long int ^outnBin)
N输入数据个数。ArrayName (O to N — 1)输入 single 数组。outnBin输出参数,nBin=N+10,N为压缩后的数据字节大小。outBin输出压缩后的Byte数据; 其中1-4个字节存放压缩后的数据字节大小;
第5字节存放数据类型,Single为3; 第6字节为压缩方式,默认方式为7 ; 第7 10为数据个数。DataZip_SingleToBinary 成功为 O,不成功为 1。
4
图2中(12)为解压Binary为Single (double转换为single,带分隔字符串转换为single,其它无法解压)函数接口,其原型为
Int DataZip—BinaryToSingle(float ^ArrayNamej long int 氺N,unsigned char ^inBinj long int ^outnBin)
N输出数据个数。ArrayName (O to N — 1)输出 single 数组。outnBin输出参数,nBin=N+10,N为解压缩后的数据字节大小。inBin待解压的输入Byte数据。其中1-4个字节存放压缩后的数据字节大小;
第5字节存放数据类型,字符串为2、single为3、double为4 ; 第6字节为压缩方式,默认方式为7 ;
第疒10字节当第三字节为single 3,double 4,则为数据个数;当为字符串时第7个字节为分隔符,第纩10个字节为空。DataZip_BinaryToSingle 成功为 0,不成功为 1。图2中(8)为将Double压缩为Binary (二进制)函数接口,其原型如下
Int DataZip_DoubIeToBinary (double ^ArrayName, long int N, unsigned char ^outBin, long int ^outnBin)
N输入数据个数。ArrayName (O to N — 1)输入 Double 数组名称。nBin输出参数,nBin=N+10, N为压缩后的数据字节大小。outBin输出压缩后的Byte数据; 其中1-4个字节存放压缩后的数据字节大小;
第5字节存放数据类型,Double为4 ; 第6字节为压缩方式,默认方式为7 ; 第7 10为数据个数。DataZip_DoubleToBinary成功为 0,不成功为 1。图2中(13)为解压Binary为Double (single转换为double,带分隔字符串转换为double,其它无法解压)函数接口,其原型如下
Int DataZip—BinaryToDouble (double ^ArrayNamej long int *N,unsigned char ^inBinj long int 氺outnBin)
N输出数据个数。ArrayName (O to N - 1)输出 Double 数组。outnBin输出参数,nBin=N+10,N为解压缩后的数据字节大小。inBin待解压缩的Byte数据; 其中1-4个字节存放压缩后的数据字节大小;
第5字节存放数据类型,字符串为2、single为3、double为4 ; 第6字节为压缩方式,默认方式为7 ;
第疒10字节当第5字节为single 3,double 4 ;则为数据个数;当为字符串时第7个字节为分隔符,第纩10个字节为空。
DataZip_BinaryToDouble成功为 0,不成功为 1。图2中(9)为将Byte压缩为Binary (二进制)函数接口,其原型如下
Int DataZip—BytesToBinary(unsigned char ^inBin, long int innBin, unsigned char ^outBin, long int ^outnBin)
inBin ()待压缩的输入数据。innBin待压缩的输入数据字节数。outnBin输出参数,outnBin =N+10,N为压缩后的数据字节大outBin输出压缩后的Byte数据; 其中1-4个字节存放压缩后的数据字节大小;
第5字节存放数据类型,Byte为O ; 第6字节为压缩方式,默认方式为7 ; 第疒10个字节为空。DataZip_ByteToBinary成功为 0,不成功为 1。图2中(14)为解压缩Byte函数接口,其原型如下
Int DataZip—BinaryToBytes (unsigned char 氺inBin, long int innBin, unsigned char 氺outBin, long int 氺outnBin)
inBin ()待解压缩的输入数据。innBininnBin =N+10,N为待解压缩的输入数据字节数。outnBinoutnBin=N,N为解压缩后的数据字节大小。outBin输出解压缩后的Byte数据; 其中1-4个字节存放压缩后的数据字节大小;
第5字节存放数据类型,Byte为O ; 第6字节为压缩方式,默认方式为7 ; 第疒10个字节为空。DataZip_BinaryToFile成功为 0,不成功为 1。图2中(10)为将文件压缩为Binary (二进制)函数接口,其原型如下
Int DataZip_FiIeToBinary(char ^TheInFile, unsigned char 氺outBin, long int 氺outnBin)
TheInFile输入文件名称(包括路径)。outnBinnBin=N+10,N为返回压缩后的数据字节大小。outBin输出压缩后的Byte数据; 其中1-4个字节存放压缩后的数据字节大小;
第5字节存放数据类型,文件为1 ; 第6字节为压缩方式,默认方式为7 ; 第疒10个字节为文件扩展名。DataZip_FiIeToBinary成功为 0,不成功为 1。图2中(15)为将压缩后的Binary解压为文件函数接口,其函数原型如下
Int DataZip—BinaryToFile (char 氺TheOutFile, unsigned char 氺inBin, long int氺outnBin)
TheOutFile输出文件名称(包括路径)。outnBinoutnBin=N+10, N 为输入数据字节大小。inBin待解压的输入Byte数据; 其中1-4个字节存放压缩后的数据字节大小;
第5字节存放数据类型,文件为1 ; 第6字节为压缩方式,默认方式为7 ; 第疒10个字节为文件扩展名。DataZip_BinaryToFile成功为 0,不成功为 1。
具体实施例方式1把压缩解压缩算法动态库引用到应用程序项目中
在项目“引用”中添加引用,把压缩解压缩算法动态库文件通过浏览添加到该项目引用里。2在进行前兆观测数据处理的应用程序中导入动态链接库函数原型 [Dlllmport(〃CompressDLL dll〃)]
//导入动态库,CompressDLL. dll所在的文件路径,相对、绝对路径皆可 static extern UInt32 DataZip_StringToBinary(string TheInStringj ref byte inBin, ref int nBin);
//声明导入压缩字符串函数 [Dlllmport(^CompressDLL. dll〃)]
//导入动态库,CompressDLL. dll所在的文件路径,相对、绝对路径皆可 static extern UInt32 DataZip_BinaryToString(StringBuilder TheOutStringj ref byte inBin, ref int nBinl); Il声明导入解压缩字符串函数 [Dlllmport(^CompressDLL. dll〃)]
//导入动态库,CompressDLL. dll所在的文件路径,相对、绝对路径皆可 static extern UInt32 DataZip_SingleToBinary(ref Single ArrayNamej int N, ref byte inBin, ref int nBin); Il声明导入压缩单精度数组函数 [Dlllmport(^CompressDLL. dll〃)]
//导入动态库,CompressDLL. dll所在的文件路径,相对、绝对路径皆可 static extern UInt32 DataZip—BinaryToSingle(ref Single ArrayNamej ref int N, ref byte inBin, ref int nBin); Il声明导入解压缩单精度数组函数 [Dlllmport(^CompressDLL. dll〃)]
//导入动态库,CompressDLL. dll所在的文件路径,相对、绝对路径皆可 static extern UInt32 DataZip—DoubleToBinary(ref Double ArrayNamej int N, ref byte inBin, ref int nBin);Il声明导入压缩双精度数组函数 [Dlllmport(〃CompressDLL dll〃)]
//导入动态库,CompressDLL. dll所在的文件路径,相对、绝对路径皆可 static extern UInt32 DataZip—BinaryToDouble(ref Double ArrayNamej ref int N, ref byte inBin, ref int nBin); Il声明导入解压缩双精度数组函数 [Dlllmport(^CompressDLL. dll〃)]
//导入动态库,CompressDLL. dll所在的文件路径,相对、绝对路径皆可 static extern UInt32 DataZip—BytesToBinary (ref byte inBin, int innBin,ref byte outBin, out int outnBin); //声明导入压缩二进制函数 [Dlllmport(^CompressDLL. dll〃)]
//导入动态库,CompressDLL. dll所在的文件路径,相对、绝对路径皆可 static extern UInt32 DataZip—BinaryToBytes(ref byte inBin, int N, ref byte outBin, out int outnBin);
Il声明导入解压缩二进制函数 [Dlllmport(^CompressDLL. dll〃)]
//导入动态库,CompressDLL. dll所在的文件路径,相对、绝对路径皆可 static extern UInt32 DataZip_FiIeToBinary (string TheInFile,ref byte outBin, out int outnBin); //声明导入解压缩文件函数 [Dlllmport(^CompressDLL. dll〃)]
//导入动态库,CompressDLL. dll所在的文件路径,相对、绝对路径皆可 static extern UInt32 DataZip_BinaryToFile (string TheOutFile,ref byte outBin, out int outnBin);
//声明导入解压缩文件函数。
3在进行前兆观测数据处理的应用程序中调用函数(C#语言为例) (1)字符型数据的压缩与解压缩 //初始化欲压缩的字符串
string strl = 〃25. 664 25. 664 25. 664 25. 664 25. 664 25. 664 25. 664 25. 664 25. 664 25. 664 25. 664 25. 664 25. 664 25. 665 25. 665 25. 665 25. 665 25. 665 25. 665 25. 665 25. 665 25. 665 25. 665 25. 665"; int slen = strl. Length;
//求字符串长度
byte [] strBin = new byte [slen]; Il开辟二进制数组空间供压缩数所存放 int outnBin = 32;
//输入字符串分隔符ASCII码,此处为空格ASCII码,没有分隔符时请初始化为,同时当输出变量时为压缩后数据字节大小int outnBinl = O ;
Il解压缩后数据大小变量声明
//把字符串压缩成二进制并输出压缩后数据字节大小 UInt32 itemp = DataZip_StringToBinary (strl,ref strBin
,ref
outnBin);
Il以下为把压缩二进制解压缩还原为字符串输出 int outSize = 0, outPreSize = 0; //声明并初始化,outSize为压缩后数据大小变量,outPreSize解压缩后数据大小变
量
DataZip_Size(ref strBin
,ref outPreSize, ref outSize); Il得到压缩二进制数据压缩后与解压缩后的数据大小
StringBuilder str2 = new StringBuilder(outSize); Il为接受解压缩字符串开辟空间
UInt32 itempi = DataZip_BinaryToString(str2,ref strBin
,ref
outnBinl);
Il输出解压缩字符串和解压缩后的数据大小
(2)压缩单精度数组到二进制并解压缩还原为单精度数组 //初始化欲压缩的单精度数组
float [] fArray = {25. 6, 25. 6, 25. 6, 25. 6, 25. 6, 25. 6, 25. 6, 25. 6, 25. 6, 25. 6, 25. 6, 25. 6, 25. 6, 25. 6, 25. 6, 25. 6, 25. 6, 25. 6, 25. 6, 25. 6, 25. 6, 25. 6,25. 6,25. 6};
UInt32 ArraySize = (UInt32)Buffer. ByteLength (fArray); Il得到单精度数组数据字节长度
float[] ρArray = new float[fArray. Length]; Il声明解压缩后存放单精度数组
byte [] inBin = new byte[ArraySize]; Il声明存放压缩后的二进制数组
int nBin = 0, nBinl = 0; Il数组压缩前后的数据大小 int N = 40, Nl = 0; Il数组元素个数
UInt32 retval = DataZip_SingIeToBinary (ref fArray
,N,ref inBin
,ref nBin);
Il压缩单精度数组为二进制并输出压缩后数据大小
UInt32 ret = DataZip_BinaryToSingle (ref pArray
,ref Ni,ref inBin
,ref nBinl);
Il解压缩输出数组、数据元素个数及数据大小
(3)压缩双精度数组到二进制并解压缩还原为双精度数组 Il初始化欲压缩的双精度数组Double 口 fArray = { 25.664,25.664,25.664,25.664,25.664,25.664, 25. 664, 25. 664, 25. 664, 25. 664, 25. 664, 25. 664, 25. 664, 25. 665, 25. 665, 25. 665, 25. 665, 25. 665, 25. 665, 25. 665, 25. 665, 25. 665, 25. 665, 25. 665}; UInt32 ArraySize = (UInt32)Buffer. ByteLength (fArray); Il得到双精度数组数据字节长度
Double [] ρArray = new Double[fArray. Length]; Il声明解压缩后存放双精度数组
byte [] inBin = new byte [ArraySize]; Il声明存放压缩后的二进制数组
int nBin = 0, nBinl = 0; Il数组压缩前后的数据大小
int N = 1440, Nl = 0; Il数组元素个数
UInt32 retval = DataZip_DoubIeToBinary (ref fArray
,N,ref inBin
,ref nBin);
Il压缩双精度数组为二进制并输出压缩后数据大小
UInt32 ret = DataZip_BinaryToDoubIe (ref pArray
,ref Ni,ref inBin
, ref nBinl);
Il解压缩输出数组、数据元素个数及数据大小 (4) 二进制的压缩与解压缩
Stringsi :="25. 664,25 664,25.664,,25 664,25 664,25.,664,25.,66425.,664,25 664,,25. 664,25.664,25.664,25.664,25.665,25.665,25.665:25.665,25,.665,25. 665,25.665,25.665,25.665,25.665,25.665,25.665;25.665,25..665,25. 665,25.666,25.666,25.665,25.665,25.666,25.666,25.666,25.666,25. 666,25.666,25.666,25.666,25.666,25.666,25.666,25.666,25. ι366,25.666,25 666,25.666,25.666"j
int strLen = si.Length;
byte [] pdata = new byte [strLen];
int strCount = 0;
DataZip_StringToBytes(si, ref strCount, ref pdata
); //此函数功能输入字符串,输出字符串长度,并输出字符串的Bytes数据 //End生成Bytes字节数据 //Begin压缩Bytes数据 byte [] pout = new byte [strLen]; int outnBin;
uint deret = DataZip—BytesToBinary(ref pdata
, strLen, ref pout
, out outnBin);
Il压缩Bytes数据为二进制 //End压缩Bytes数据//Begin解压缩Bytes数据 int outnBinl; byte [] pdatal = new byte [strLen]; deret = DataZip—BinaryToBytes (ref pout
, outnBin, ref pdatal
, out outnBinl);
Il解压缩二进制为Bytes数据 //End解压缩Bytes数据 //Begin把二进制数据还原为字符串 StringBuilder outstr = new StringBuilder (si. Length); int count = si. Length;
DataZip_By^esToString(outstr, ref count, ref pdatal
); //此函数功能输入字符串的Bytes数据,输出字符串,并输出字符串长度 (5)对文件的压缩与解压缩
string fiIeName = 〃E:\\CompressNew\\ExampleData\\ll· csv〃; Il欲压缩的文件路径
string fiIeOutName = 〃E:\\CompressNew\\ExampleData\\122〃; Il还原成文件的路径
uint retBin,retFile; int nBin, outnBin; byte[] pBin = new byte [20480]; retBin = DataZip_FiIeToBinary(fiIeNamej ref pBin
, out nBin); Il根据文件路径压缩二进制并输出压缩后的大小
retFile = DataZip—BinaryToFile(fileOutName, ref pBin
, out outnBin); Il解压缩二进制,输出文件与解压缩后的大小 4地震前兆原始数据数据库存储字段定义为BLOB类型
建立数据库表时将原始数据字段定义为BLOB类型,不再采用以往的CLOB类型。
5通过数据库操作语句插入压缩后的二进制地震前兆原始数据到BLOB字段。
权利要求
1.地震前兆采样数据压缩存储与解压缩,实现了对字符串、单精度数组、双精度数组、 二进制图片或图像、文件的压缩与解压缩,其特征是字符串、单精度数组、双精度数组、二进制图片或图像、文件是在内存变量或数组中直接压缩成二进制数组,并以二进制形式存储到数据库中的BLOB字段。数据使用时,由数据库提取二进制压缩数组后经解压缩还原成字符串、单精度数组、双精度数组、二进制图片或图像、文件;降低了磁盘占用率、提高了磁盘的使用效率、加快了网络传输速度,同时也起到了加密的作用。
2.根据权利要求1所述的地震前兆采样数据压缩存储,其特征是实现了对地震前兆采样数据的压缩存储。
3.根据权利要求2所述的地震前兆采样数据压缩存储,其特征是以能对地震前兆采样数据的原始数据、预处理数据、产品数据、事件数据等的压缩存储。
4.根据权利要求1所述的地震前兆采样数据压缩存储,其特征是能够实现对字符串、单精度数组、双精度数组、二进制图片或图像、文件进行二进制压缩与存储。
5.根据权利要求1所述的地震前兆采样数据解压缩,其特征是能够对压缩后的二进制数据进行解压缩逆运算后进行还原。
6.根据权利要求1所述的压缩数据为二进制数组,其特征是数据在内存变量或数组中直接压缩成二进制数组。
7.根据权利要求1所述的地震前兆采样数据压缩存储与解压缩,其特征是目的是降低磁盘占用率、提高磁盘使用率、加快网络传输速度、进行前兆数据加密。
全文摘要
地震前兆采样数据的压缩存储与解压缩技术,涉及我国地震前兆采样数据在数据库中的存储以及数据使用方式。通过在计算机内存中直接将地震前兆采样数据进行二进制压缩与解压缩,可大大减少数据的磁盘占用率,同时也可起到加密的作用,特别适用于高采样率地震前兆数据的二进制压缩与存储,进一步提高数据库的使用效率。本发明提供了一种对地震前兆采样数据进行二进制压缩与存储的技术,对地震前兆数据的压缩、解压缩均在电脑内存中直接实现,压缩后的二进制数据保存到数据库的二进制大对象(BLOB)字段;使用数据时,从数据库字段中取出该压缩二进制数据,再进行解密、解压缩的逆运算将压缩二进制数据进行还原,从而弥补了现有前兆数据库中由于直接保存文本数据而导致的磁盘空间迅速增长、磁盘利用率低下、网络传输时间长、数据保密性不强等不足。
文档编号G01V1/24GK102445707SQ20101029842
公开日2012年5月9日 申请日期2010年10月4日 优先权日2010年10月4日
发明者刘坚, 张兴国, 李盛乐, 王子影 申请人:刘坚, 张兴国, 李盛乐, 王子影