CN104462147A - 一种文档的存储方法 - Google Patents
一种文档的存储方法 Download PDFInfo
- Publication number
- CN104462147A CN104462147A CN201310441740.4A CN201310441740A CN104462147A CN 104462147 A CN104462147 A CN 104462147A CN 201310441740 A CN201310441740 A CN 201310441740A CN 104462147 A CN104462147 A CN 104462147A
- Authority
- CN
- China
- Prior art keywords
- node
- document
- data
- storage
- information
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/80—Information retrieval; Database structures therefor; File system structures therefor of semi-structured data, e.g. markup language structured data such as SGML, XML or HTML
- G06F16/81—Indexing, e.g. XML tags; Data structures therefor; Storage structures
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种文档的存储方法,预先配置由至少一种结点类型定义的且具有树型结构文档类型,设置包括结点索引表和结点数据区的文档存储格式,该方法包括:确定文档的文档类型,根据该文档类型,将文档的内容映射为对应树型结构中的各个结点及其数据;根据对应的树型结构中的各个结点及其数据,为文档分配存储空间,在分配的存储空间中为结点索引表和结点数据区分配各自的存储区域;在分配的结点数据区中存储结点的数据,并在分配的结点索引表中记录每个结点与该结点数据存储位置的对应关系。应用本发明的存储方法,能够提高文档的访问性能。
Description
技术领域
本发明涉及计算机存储技术,具体涉及一种文档的存储方法。
背景技术
可扩展标记语言(XML)是一种文档描述语言,利用该语言描述的文档称为XML文档。
XML文档有很多优势。XML是一种元标记语言,开发者可以根据自己的需要定义自己的标记,XML的文档是有明确语义并且是结构化的,抗破坏能力很强,XML表示的信息独立于平台的,这里的平台即可以理解为不同的应用程序也可以理解为不同的操作系统,对于大型复杂的文档,XML不仅允许指定文档中的词汇,还允许指定元素之间的关系。XML文档由文档类型定义(DTD)/模式(Schema)和XML文本组成,DTD/Schema就是一组标记符的语法规则,表明XML文本是怎么样组织的,这样的组成方式使XML文档实现了内容与形式的分离,成就了上述众多优点。
但是,XML文档的缺点在于,在将文档存储为XML文档后,如果要访问某个对象,需要首先对整个文档进行解析,将其转换为树型结构的组织方式,再搜索要访问的对象,进行访问。可以看出,应用上述存储方式存储某文档后,当用户对文档的部分内容进行访问时,系统需要首先耗费资源对整个文档进行解析,然后才能选择用户感兴趣的内容进行显示,延长了处理时间,进而降低了访问性能,浪费了系统资源。
发明内容
有鉴于此,本发明提供一种文档的存储方法,能够提高访问性能。
为实现上述目的,本发明采用如下的方案:
一种文档的存储方法,其特征在于,预先配置由至少一种结点类型定义的且具有树型结构文档类型,设置包括结点索引表和结点数据区的文档存储格式,该方法包括:
确定文档的文档类型,,根据该文档类型,将文档的内容映射为对应树型结构中的各个结点及其数据;
根据对应的树型结构中的各个结点及其数据,为文档分配存储空间,在分配的存储空间中为结点索引表和结点数据区分配各自的存储区域;
在分配的结点数据区中存储结点的数据,并在分配的结点索引表中记录每个结点与该结点数据存储位置的对应关系。
较佳地,所述为文档分配的存储空间可以包括超级块、i结点inode表和数据块;所述超级块包括空闲块表和空闲inode表,用于所述存储空间中空闲空间的管理。
较佳地,所述为结点索引表分配存储区域可以为:为结点索引表设置一个inode,利用inode/空闲表freelist机制在所述数据块部分为所述结点索引表分配存储区域;
所述为结点数据区分配存储区域可以为:为结点数据区设置一个inode,利用inode/freelist机制在所述数据块部分为所述结点数据区分配存储区域。
较佳地,在所述超级块中可以进一步包括inode0,用于记录inode表所占用的数据块号。
较佳地,所述在结点数据区中存储结点的数据可以为:为结点设置一个inode,利用inode/freelist机制在所述数据块部分为所述结点分配存储区域,将该结点数据存储到分配的存储区域内,并将结点对应的inode标识存储到所述结点数据区中;
所述结点数据存储位置可以为:该结点对应的inode标识在结点数据区中的存储位置。
较佳地,所述将各个结点的数据存储到所述结点数据区可以为:在结点数据区中顺序存储每个结点的结点类型标记、结点长度、结点的属性的名称/标记和值;
所述结点数据存储位置可以为:结点数据在结点数据区中的起始偏移量。
较佳地,可以在所述结点数据区末尾处记录结点数据区中空闲区域在所述结点数据区中的起始偏移量。
较佳地,所述将各个结点的数据存储到所述结点数据区可以为:将结点数据区分成若干页面,将每个结点的数据存储到特定的页面上,并在页内存储偏移量数组,用于表示该页内各个结点在页内的起始偏移量;
所述结点数据存储位置可以为:结点数据所在的页面地址和在所述偏移量数组中与该结点数据对应的元素索引。
较佳地,该方法可以进一步包括:在所述存储空间中为结点数据区的空闲页索引分配存储区域,在所述空闲页索引中记录结点数据区的各个页面与该页面中空闲空间大小的对应关系。
较佳地,所述为空闲页索引分配存储区域可以为:为空闲页索引设置一个inode,利用inode/freelist机制在所述数据块部分为所述空闲页索引分配存储区域。
较佳地,所述访问文档的入口信息可以包括:结点索引表和结点数据区的存储位置及长度、文档根结点的ID。
较佳地,当结点索引表和结点数据区的存储区域是采用inode/freelist机制分配时,所述结点索引表的存储位置可以为结点索引表对应的inode标识;所述结点数据区的存储位置为结点数据区对应的inode标识。
由上述技术方案可见,在本发明中,预先配置代表不同树型结构的文档类型,定义文档存储格式包括结点索引表和结点数据区。利用上述带结点索引的文档存储格式,可以实现结点的快速搜索。在存储某文档时,首先根据该文档的文档类型,将文档内容映射为对应树型结构中的各个结点及其数据。通过此种方式,使文档由结点构成,各个结点间通过树型结构组织起来。然后,根据文档长度,在存储介质中为文档分配一定的存储空间,在该存储空间中进一步为结点索引表和结点数据区分别分配各自的存储区域。最后,将文档对应的各个结点数据存储到结点数据区,并在结点索引表中记录每个结点与该结点数据存储位置的对应关系,在文件头中存储访问文档的入口信息。通过上述方式,就可以将一个文档按照树型结构在存储介质中进行存储,同时采用带结点索引的存储格式。对于此类采用树型结构和结点索引方式存储后的文档,当用户对文档的部分内容进行访问时,可以直接对该内容对应的结点进行访问,而不需要预先对整个文档进行处理,节省了系统资源,提高了访问性能;另外,本发明的方法依然保留文档类型的配置,继承了XML文档的优势。利用本发明的文档存储方法可以支持复杂树形结构数据的存储、存储空间小、扩展性好、可增量修改、易于提高存储安全性。
更进一步地,本发明对结点索引表和结点数据区分配存储区域时,将结点索引表和结点数据区分别当作两个文件看待,采用与UNIX的inode/freelist近似的机制进行这两个存储区域的分配、组织和回收,使这两个存储区域易于收缩和扩张,从而简化了增加结点及增长结点数据时的操作。
附图说明
图1为本发明的文档存储方法总体流程图。
图2为本发明实施例中文档存储方法具体流程图。
图3为收缩文档存储空间的流程图。
具体实施方式
为使本发明的目的、技术手段和优点更加清楚明白,以下结合附图对本发明作进一步详细说明。
本发明的基本思想是:预先配置由至少一种结点类型定义的具有树型结构的文档类型,定义包括结点索引表和结点数据区的文档存储格式。在存储某文档时,首先根据该文档的文档类型,将文档内容映射为对应树型结构中的各个结点及其数据。然后,根据文档长度,在存储介质中为文档分配一定的存储空间,在该存储空间中进一步为结点索引表和结点数据区分别分配各自的存储区域。最后,将文档对应的各个结点数据存储到结点数据区,并在结点索引表中记录每个结点与该结点数据存储位置的对应关系。
在本发明的实施例中,为了叙述的方便,可以将依照上述存储方式存储的文档统称为SurXml文档(由Sursen公司定义的XML文档)。
图1为本发明的文档存储方法总体流程图。如图1所示,该方法包括:
步骤101,预先配置至少一个结点类型定义的具有树型结构的文档类型;定义包括结点索引表和结点数据区的文档存储格式。
本发明的核心是将文档以树型结构直接存储到存储介质中,本步骤中配置的文档类型即代表了树型结构的具体组织方式。
步骤102,参照步骤101中配置的文档类型,确定并存储文档的文档类型,并根据该文档类型,将文档的内容映射为对应树型结构中的各个结点及其数据。
步骤103,根据对应树型结构中的各个结点及其数据的长度,为文档分配存储空间,在分配的存储空间中为结点索引表和结点数据区分配各自的存储区域。
步骤104,在结点数据区中存储结点的数据,并在结点索引表中记录每个结点与该结点数据存储位置的对应关系。
至此,本发明的存储方法流程结束。在上述流程中,步骤102和步骤103是顺序执行的,事实上,也可以先执行步骤103再执行步骤102,或者两个步骤同时执行。
上述为本发明的文档在存储介质中存储方法的总体概述,下面通过具体实施例说明该存储方法的具体实施方式。
实施例:
图2为本发明实施例中文档存储方法具体流程图。如图2所示,该方法包括:
步骤201,预先配置由至少一个结点类型定义的且具有树型结构的文档类型,定义包括文件头、结点索引表和结点数据区的文档存储格式。
本实施例中,配置的文档类型包括下列信息:a、文档中包含哪些类型的结点(结点类型);b、文档中包含的各种类型的结点的名称、结点中包含的各个属性的名称/类型;c、各种结点之间可能的父子关系。通过上述信息,文档类型即可以描述一种特定的树型结构。举一个简单的文档类型的例子,在该文档类型中,根结点下有若干页面(page)子结点,每个page子结点下有若干文本(text)和图像(image)子结点。具体来说,每个节点类型都定义有一个结点类型标记,唯一标示一个结点类型。本步骤中还定义了带结点索引的文档存储格式,具体为文件头、结点索引表和结点数据区。其中,文件头用于提供访问文件的入口信息,并不能理解为访问文件的入口信息一定存储在文件的头部,实际上,可以约定将入口信息存储在文件的任何部分,如文件的尾部;结点索引表用于记录各结点数据的具体存储位置,以方便检索各结点数据;结点数据区用于存储各结点数据。
当要存储某文档时,执行以下操作。步骤202,参照步骤201中配置的文档类型,确定要存储文档的文档类型,并存储该文档类型信息。
本步骤中,确定文档类型后,将该文档类型信息进行存储。这里涉及到文档类型的表示和文档类型信息的存储两方面的内容。
文档类型可以通过两种格式来表示:类型表,如自定义的类型表,以及XMLSchema/DTD/Relax NG,其中,Relax NG是由OASIS提出的一种文档类型定义方式。
(一)类型表格式:
类型表是一种数据结构,任何能够描述文档类型信息的数据结构,都可以认为是类型表。这里给出一种示例实现,但实际可能的实现并不限于该示例:
属性的定义,包括名称和类型。这里,可以为每一个属性定义唯一标记,利用属性标记作为属性的名称;属性的类型可以是属性的数据类型,也可以为每个属性类型定义唯一标记。
这是一种非常简单的定义方法,对迭代、选择、序列、重复等结构都没有加入,但大部分文档的类型信息也都能够使用上述结构进行描述。
(二)XML DTD/Schema/Relax NG格式
XML文档虽然在物理存储上是线性的,但逻辑上也是由结点构成的树型结构。因此,用于描述XML文档类型的DTD/Schema/Relax NG等格式也可以用于描述本发明的文档类型。
此外,无论是DTD、Schema或Relax NG,都支持为结点定义名称、属性、子结点;与类型表格式给出的简单方法相比,这种方法对子结点的迭代、选择、序列、重复有很好的支持,能够描述更复杂的文档类型。
这里给出一个使用Schema描述的文档类型定义,DTD和Relax NG的形式虽然不同,但三者在实质上是比较类似的。另外,实际文档类型并不受限于该示例:
通过上述两种方式的任意一种都可以表示文档类型。下面介绍文档类型信息的存储方式。
存储文档类型信息时采用线性字符序列进行存储。具体地,对于利用类型表格式表示的文档类型,可以根据所用的自定义类型表,规定一组序列化函数,将类型表的数据转换为线性字符序列;对于利用DTD/Schema/Relax NG格式表示的文档类型,因为DTD/Schema/Relax NG文件本身就已经是线性字符序列,所以可以直接存储DTD/Schema/Relax NG文件本身。当然,在存储该文档类型信息前,也可以根据需要,预先对要存储的文档类型信息进行加密、压缩和变换等处理,然后将处理结果作为文档类型信息存储。
存储文档类型信息时,可以将文档类型信息进行远程存储、本地存储或存储在程序逻辑中。下面分别介绍三种存储位置下,存储文档类型信息的不同实现方式。
(一)文档类型信息可以在本地存储,所谓本地存储是指在存储文档的具体文件中存储文档类型信息。这里给出一种示例方法:
在文件中,增加一个自定义的存储区域,用于存储文档类型信息,指定该区域的方法,包括但不限于下述方法:自文件中某个指定位置开始的一段指定长度的区域;在文档类型的树型结构中增加一个特定的结点或属性,作为文档类型信息的存储。
文档类型信息存储在本地后,访问该文档的程序则默认使用文档内部的文档类型信息。
(二)文档类型信息可以在远程存储,所谓远程存储是指在存储文档外部的其它文件系统中存储文档类型信息。文档类型信息在远程存储时,包括但不限于下述方法:远程或分布式文件系统,如网络文件系统(NFS)、WIN2000分布式文件系统(DFS)、安德鲁文件系统(AFS);本地文件系统;网页(WEB)服务器;文件传输协议(FTP)服务器。将文档类型信息存储在远程后,还要将远程的文档类型信息的URL或路径信息,存储到SurXml文档内部,选择存储位置的方法,与本地存储方法选择文档类型信息存储位置的方法相同。访问SurXml文档的程序根据文档中保存的URL或路径信息查找文档类型信息。
(三)除上述两种对文档类型信息进行显式(即存储在文档内部或外部)的存储外,还可以将文档类型信息存储到访问SurXml文档的程序逻辑中。具体地,可以通过一组应用程序接口(API)函数进行硬编码,在访问SurXml文档内容之前,应用程序需要调用该API函数,在内存中建立文档类型信息数据;或者,直接将文档类型信息存储到访问SurXml文档的应用程序的源代码或二进制映像中,访问SurXml文档的程序可以直接将文档类型信息复制到内存中使用。这种非显式的存储方法,只能支持数量有限的文档类型,而且程序中需要为每一种文档类型分配ID,在SurXml文档中需要存储所使用的文档类型的ID。
存储文档类型信息时,还可以是采取上述三种存储方式中任意组合。如将部分文档类型信息进行远程存储、将部分文档类型信息进行本地存储,或将部分文档类型信息存储在程序逻辑中。
步骤203,根据文档类型,将文档的内容映射为对应树型结构中的各个结点及其数据。
本实施例中,定义结点的数据包括结点的内容信息和位置信息。具体地,结点的内容信息用来描述本结点对应的文档内容,包括结点类型标记、结点长度、结点的属性的名称/标记和值;结点的位置信息用来描述本结点在整个文档对应的树型结构中的位置,有可称为相关结点索引信息。该相关结点索引信息包括结点的父结点ID、结点左右兄弟结点ID、结点最左侧子结点ID、结点的子结点数目、结点的所有子结点ID。其中,结点左右兄弟结点ID和结点的所有子结点ID是可选项,没有这两项内容,也能够将本结点在树型结构中的位置表述清楚,增加这两项内容的目的是提高检索速度。
本步骤中,根据文档类型将文档内容映射为不同的结点及其数据。例如,映射PDF文档时,将每个页面映射为一个page结点,将该页面内的文字信息部分和图像信息部分分别映射为该page结点的两个子结点,结点ID分别为A和B。Page结点的内容信息包括:结点类型标记为page结点,结点长度值,结点属性的名称/标记和值包括页眉、页脚和页码等信息。Page结点的相关结点索引信息包括:父结点为PDF文档的根节点,左右兄弟结点为其它page结点,最左侧子结点ID为A,子节点数目为2,所有子节点ID为A、B。
步骤204,根据各个结点及其数据的长度,为文档分配存储空间,在存储空间中为文件头、结点索引表和结点数据区分别分配各自的存储区域。
一般来说,文件头的长度或者是固定的,或者比较短,不需要复杂的存储分配机制支持,可以直接对其分配固定的存储区域;而对于结点索引表和结点数据区来说,其长度则随着结点数目的增加而增加,因此,在本实施例中,采用可收缩的存储分配、回收机制来对结点索引表和结点数据区的存储区域进行分配和组织。另外,该机制还用于大对象的存储分配。
本实施例中采用的可收缩的存储分配、回收机制为类似于UNIX文件系统中inode/freelist的机制。具体地,将结点索引表和结点数据区分别看做一个文件,各自对应一个inode。
在inode/freelist机制中,整个存储空间分为三大部分:超级块、Inode表和数据块,如表1所示。
超级块 | inode表 | 数据块 |
表1
与UNIX文件系统类似,在本实施例中,表1的超级块和inode表用于存储空间的分配和组织,而实际的数据位于数据块部分。表2是超级块内部的结构。
空闲块表 | 空闲INODE表 | Inode0 |
表2
在表2中,空闲块表用于存储空间的分配和回收,空闲INODE表用于管理inode表中的inode;inode0是本发明实施例对原有的unix文件系统中超级块的一个扩充。在原始的UNIX系统中,inode表是固定大小的一个区域,因此能够容纳的inode数目也是有限的;本实施例在超级块中加入一个特殊的inode,其中记录了inode表所位于的数据块号,这样,inode表所占据的存储空间也可以进行扩充和收缩。
下面简单介绍一下UNIX文件系统中inode与文件的关系。每个文件都对应于一个inode,inode用于记录其所对应的文件中所包含的数据块的块号,也即指明该inode所对应的文件数据的具体存储位置。在每个inode内部保存有一个块号数组,该块号数组的前若干项记录了存储该inode对应文件数据的数据块块号,在该块号数组的最后三项分别记录间接块、二次间接块和三次间接块的块号。其中,所谓间接块是指记录了数据块块号的数据块,通过间接块的内容,可以找到对应数据块的块号,再进一步根据该块号找到存储文件数据的数据块;所谓二次间接块是指记录了间接块块号的数据块,三次间接块是指记录了二次间接块块好的数据块。图3即为块号数组及数组内容对应数据块的示意图。其中,301为数据块、302为间接块、303为二次间接块、304为三次间接块。
对于比较小的文件,可以只利用inode表中前若干数据块块号项记录文件的存储位置;对于比较大的文件,除利用块号数组中的数据块块号项外,还可以利用最后的间接块、二次间接块和三次间接块的块号项记录文件的存储位置,尤其对于结点数据区的存储,间接块可以发挥很大的作用。当然,间接块的块号项也可以继续包括四次间接块、五次间接块等,视inode对应的文件大小而定。
在本实施例中,将结点索引表和结点数据区均视为一个文件,假定为结点索引表设置inode1,为结点数据区设置inode2;则inode1记录结点索引表的具体存储位置,inode2记录结点数据区的具体存储位置。
步骤205,在结点数据区中存储结点的数据,并在结点索引表中记录每个结点与该结点数据存储位置的对应关系。
本实施例中,结点数据在结点数据区中的存储方式有两种:tlv方式和SlottedPage方式。
tlv即结点类型标记(tag)+结点长度(length)+结点的值(value),在这种存储方式下,所有结点按一定顺序排列,每个结点内部,类型名称在前,接下来存储的是结点长度,最后是结点的属性值和其它相关结点的ID。
在结点数据区中,以tlv方式顺序存储的结点是从头部开始线性排列的。在将所有结点数据存储完毕后,结点数据区可能还有一定量未使用的空闲区域。本实施例中,在结点数据区末尾处,记录空闲区域开始处在数据区中的偏移量,以方便管理空闲区域。当然也可以预先在结点数据区中预留一个结点数据区以记录空闲区域开始处在数据区中的偏移量。
下面介绍SlottedPage方式。为实现该存储方式,将结点数据区分成大小固定的页,每个结点都位于某个特定的页上,一个页内可以存储多个结点。在页内部的前后两端,分别记录页面内部各个结点偏移量的数组和结点的数据,偏移量数组和结点数据相对增长。在SlottedPage存储方式中,在页面内部,结点的数据是可以在页面的空闲区域内自由移动的。这种方式,在修改结点数据,特别是结点数据长度产生变化时,是比较灵活的,而且分页式的存储比较适合于使用缓存的环境;缺点在于,结点的长度会受到页面大小的制约,只适用于比较小的结点。
对长度比较大的结点或属性,比如图像、视频、音频等数据,无论是以tlv或SlottedPage的方式进行存储,都不太合适。如果使用tlv方式存储结点数据,在加载该结点数据时,会占据大量的内存;而如果使用SlottedPage方式,则由于页面大小的限制,无法建立比较大的结点对象。本实施例中,对长度比较大的结点,将其结点数据看做一个文件,采用前述的inode/freelist机制进行存储。具体地,在inode表中为要存储的大结点设置一个inode,利用块号数组记录该结点数据的存储位置,并在结点数据区中记录结点对应的inode号。
对结点数据进行存储后,还需要在结点索引表中记录该结点与结点数据存储位置的对应关系。针对结点数据的不同存储方式,可以采用不同的方式表示结点数据的存储位置。当结点数据采用tlv方式存储时,可以采用该结点数据在结点数据区中的起始偏移量表示结点数据的存储位置。
当结点数据采用SlottedPage方式存储时,可以采用结点所在的页面地址和记录该结点页内偏移量数组元素的索引表示结点数据的存储位置。这样,当结点数据在页面内移动时,虽然其页内偏移量可能变换,但偏移量数组元素的索引不变,于是在结点索引表中表示的结点数据存储位置也不会发生变化。当检索该结点数据时,结合结点索引表中表示的结点数据存储位置和该页面中偏移量数组元素的值即可以准确定位结点数据的位置。
当结点数据采用inode/freelist方式存储时,可以将该结点对应的inode号在结点数据区中的存储位置作为结点数据的存储位置记录在结点索引表中。
记录结点与该结点数据存储位置的对应关系时,可以采用索引的方式记录。即,将结点的ID映射到该结点的数据在结点数据区的存储位置。结点索引的实现方法可以有以下几种:
1)哈希索引
将结点ID作为键值,建立哈希表,哈希表中存储结点数据在结点数据区中的存储位置。
2)B树(或B+树)索引
将结点ID作为键值,建立B树(或B+树)。
3)线性表
如果结点数目较少,也可以使用线性表来存储结点ID和对应的存储位置。
在结点数目比较多的情况下,建议使用哈希索引或B树(B+树)索引,在这两种索引的公知实现方法中,都有针对分页存储方式进行实现的算法,因此,可通过控制内存中缓存的页数目,来控制索引表的内存占用量,既可以快速的将结点ID映射到结点的存储位置,同时又不占用大量的内存。
总之,对于任意结点,需要将结点数据在结点数据区进行存储,再根据该结点数据在结点数据区的存储位置,对应填写结点索引表。
步骤206,在文件头中存储访问文档的标识信息和入口信息。
文件头的主要目的在于对文件进行描述,提供一些元数据以及访问文件内容的入口信息。在本发明一实施例中,并不需要在文件头中存储访问文档的标识信息,标识信息可以用文件后缀来代替。
本发明形成的SurXml文档的文件头需要提供的入口信息包括:结点索引表和结点数据区在文件中的存储位置和长度;一个或多个根结点(SurXml文档的逻辑结构是树型的,因此结点可能组成一棵树,也可能是多棵树)的ID。其中,结点索引表和结点数据区在文件中的存储位置为各自对应的inode号。
SurXml的文件头需要提供的描述信息可以是比较随意的,但必须包括一个或多个具备唯一性的标识,使得需要访问文件内容的应用程序能够将文档识别为SurXml。
对于SurXml文件头的结构,此处给出一些可能的方案:
1)使用文本格式,借用ini文件格式,x=y的形式,对二进制数据(偏移量、长度、根结点ID等)转换为文本数据。
2)使用文本格式,借用xml文件格式,形如<x>y</x>,对二进制数据的处理同1。
3)使用二进制格式,按照硬编码的偏移量和长度保存各种元数据和入口信息。
4)使用二进制格式,将元数据和入口信息的名称和值一同存储,在文件头中顺序存储。
5)其它的文本或二进制格式。
对于如何在文件中定位文件头数据的起始偏移量和长度,可使用下述几种设计:
1)文件头数据的起始偏移量可以是固定的,也可以记录到文件中某个固定的偏移量位置;
2)文件头数据的长度可以是固定的,也可以记录到文件中某个固定的偏移量位置;
3)设计1)和设计2)的某种组合方式;
4)对于设计1)和设计2)中在固定的偏移量位置记录文件头数据的起始偏移量和长度的做法,还可以进一步深化,在某个固定的偏移量位置o1记录o2的偏移量,在o2偏移量处记录o3……,在on处记录文件头数据的偏移量和长度。
至此,就完成了将一个文档存储在文件中的过程。
在上述存储过程中,步骤206是在步骤205之后执行的,事实上,步骤206也可以与步骤205同时执行,或在步骤205之前执行。
对于依照上述方式存储后的SurXml文档,当应用程序访问该文档时,首先要确定该SurXml文档类型,然后确定要访问的内容对应的结点ID,通过在结点索引表中查找结点ID对应的表项,确定该结点数据的存储位置,继而可以访问该结点数据。可见,当访问文档时,不需要对整篇文档进行解析处理,可以直接访问结点数据,访问速度快,处理方便,极大地提高了访问性能。
依照上述方式存储好的SurXml文档,可能其内容占用的空间并未完全占据为SurXml文档分配的存储空间,也即为文档分配的存储空间有空闲的区域。本发明的存储方法可以对文档存储空间中的空闲区域以及文档内部结点数据区中的空闲区域进行有效的管理。
当分配或回收空闲块时,都从空闲块表的尾部进行。首先分配或回收空闲块表中最后一部分指向的空闲块。
为SurXml文档所占用的存储空间是可以扩展和收缩的。存储空间的扩展是比较简单的,只需要将扩充的空闲空间纳入到空闲块表的管理即可,实际上就是将新的空闲块号追加到空闲块表的末尾。
上述是对于SurXml文档占用的存储空间的管理。在为结点数据区分配的存储区域中,其空闲空间的组织和管理是根据结点数据的存储方式,在结点数据区占用的存储区域内部进行的。
在tlv存储方式下,在结点数据区末尾处,记录空闲区域开始处在数据区中的偏移量,以方便管理空闲区域。
在SlottedPage存储方式下,结点数据区的各个页内部的空闲空间是自行管理的;如果需要为新结点搜索空闲空间时,可以逐页搜索;要提高搜索的效率,亦可另外建立一个对结点数据区中各个页中空闲空间大小进行索引的空闲页索引,可以使用的索引方法包括:直接记录页面的编号和空闲空间的大小、以空闲空间大小为键值对页面编号排序、B树/B+树(以空闲空间大小为键),等等。结点数据区的空闲页索引存储的分配、组织、回收,可以使用inode/freelist机制,将结点数据区的空闲页索引作为对应某inode的文件处理。
应用上述方法可以方便地管理文档中的空闲区域。当结点数据区中出现较大的空闲区域后,可以根据策略将该空闲区域标记为SurXml文档的空闲数据块,即将该空闲区域从结点数据区中删除。当SurXml文档需要空间收缩操作时,依照前述方法进行压缩。这种空闲区域的管理方法,使文档空间的收放更加方便,有效提高了文档的存储效率。
按照图2所示的方式存储SurXml文档的过程中,涉及到的对结点的操作包括:创建结点、删除结点、添加子结点和修改结点的属性。
(一)在存储文档时,对于尚未存在的结点,要存储该结点数据均涉及到创建结点的操作,例如在已建立的文档中新添加一个表格。该操作具体包括以下步骤:
a、确定结点类型标记和结点属性数据。
b、在结点数据区中查找空闲区域,并根据结点属性数据,分配一定量的空间。
在查找空闲区域时,根据结点数据区中结点数据的不同存储方式,采用前述的结点数据区中空闲空间的组织管理方法进行。
c、在结点索引表中增加一项,分配新的结点ID,并指向分配的结点数据在结点数据区中的存储位置。
d、将输入的结点类型标记、结点属性数据记录到为该结点分配的在结点数据区的存储位置中。
(二)在已存在的SurXml文档中,当文档内容进行删减时会涉及到删除结点的操作,例如,将文档中的某表格删除。该操作具体包括以下步骤:
a、确定删除结点ID。
b、在结点索引表中查找结点ID,得到结点数据在结点数据区中的存储位置。
c、在结点数据区中,将结点数据对应存储位置的空间标记为空闲。
d、从结点索引表中删除该结点ID对应的索引项。
(三)在已存在的SurXml文档中,将某个新创建的结点与树型结构中的其它结点建立连接关系时,会涉及到添加子结点的操作,例如,将新添加的表格与其所在的页面建立连接关系。该操作具体包括以下步骤:
a、确定父结点ID,子结点ID和子结点位置。
其中,子节点位置是指子结点在父结点的所有子结点中的位置。
b、在结点索引表中查找父子结点的ID,得到父结点数据的存储位置。
c、在结点数据区中,更新父结点的子结点ID列表,更新子结点的父结点ID值。
(四)删除子结点的操作是与添加子结点相对应的,即取消结点间的连接关系,例如,将某表格从当前所在的页面移走。该操作具体包括以下步骤:
a、确定父结点ID和要删除的子结点ID。
b、在结点索引表中查找父子结点的ID,得到该对父子结点数据的存储位置。
c、在结点数据区中,从父结点的子结点ID列表中删除输入的子结点ID,从子结点中将父结点ID值置为空。
(五)当对SurXml文档进行修改后,可能会涉及到修改结点属性的操作,例如,将表格中的某一些进行修改。该操作具体包括以下步骤:
a、确定结点ID、结点属性名称和结点属性值。
b、在结点索引表中查找结点ID,得到结点数据的存储位置。
c、在结点数据区中找到结点数据,根据结点属性名称,对对应的结点属性值进行更新。
d、如果空间不足,则分配新的空闲空间,并将结点数据复制到新的空间,将原有的结点数据所在数据块标记为空闲,同时更新结点索引表,将对应的表项指向新的存储位置。
应用上述方式存储后形成的SurXml文档,可能有时需要进行加密、无损压缩等操作。这些均可以通过对该文档的子树进行相应的可逆变换来实现。下面以加密操作为例,说明对本发明实施例的SurXml文档进行指定的可逆变换的具体实施方式。具体操作包括以下步骤:
a、确定子树根结点ID和加密函数。
由于进行加密可能是整篇文档,也可能是文档中的某部分,因此本步骤中,需要确定进行加密部分在整个文档中的位置。具体地,即确定加密部分对应的子树根节点。
b、根据确定的子树根结点ID,遍历子树。
本步骤中,遍历可使用深度优先遍历或广度优先遍历。
c、将遍历到的各个结点的ID和数据,记录到一个线性的缓冲区中,并利用确定的加密函数处理该缓冲区中的数据。
本步骤中的操作即实际完成对指定的文档内容进行加密的过程。
d、更新结点索引表和结点数据。
本步骤中,在结点索引表中,将子树根结点标记为变换树的根;其它变换结点标记为变换树的内部结点,并将根结点的ID记录到索引中。为保证结点间的连接关系,所有变换后的结点ID均保持不变。
在结点数据区中,将加密函数处理得到的结果,作为子树根结点的数据保存;同时,清空子树中除根结点外的其它结点的数据。
至此,便完成了对指定文档内容进行加密的操作。
与上述对文档进行可逆变换相对应地,还可以对变换后的文档进行逆变换,得到初始文档。下面以解密操作为例,说明对上述变换后的SurXml文档进行逆变换的具体实施方式。具体操作包括以下步骤:
a、确定子树根结点ID和解密函数。
与加密过程对应地,本步骤中,需要确定进行解密的部分对应的子树根节点ID。
b、根据子树根结点ID,在结点索引表查找子树根结点数据在结点数据区中的存储位置。
c、使用解密函数,处理子树根结点的数据。
由于加密后的整个子树结点的数据均作为子树根节点数据存储,因此只要对子树根节点数据进行解密,也即对整个子树结点的数据进行解密。
d、从解密函数处理得到结果中,按加密过程的遍历次序,依次恢复各个结点的数据。
e、将结点索引表中的子树根结点和各个内部结点都标记为普通结点。
至此,解密操作结束。
对于其它诸如压缩等可逆的变换和逆变换的过程与上述实施方式相同,只是将相应的加密、解密函数替换为压缩、解压缩等函数即可,这里就不再赘述。
依照上述方法不仅可以对整篇文档进行可逆变换,还可以对其中存储后的任何子树进行变换,从而实现对文档的部分内容进行加密、无损压缩等操作。
XML文档是一种常见的文档格式,依照本发明的存储方法形成的SurXml文档还可以与XML格式文档进行相互转换。
具体地,将XML文档转换为SurXml文档的具体过程包括:
a、得到XML文档的Schema或DTD,直接将其作为SurXml文档的文档类型定义。
b、解析XML文档,将各个元素分别转换为SurXml文档中的结点,将其属性设置在相应的结点中;并根据XML文档中各个元素的父子关系,设置SurXml文档中各个结点的父子关系。
c、根据步骤a和b的结果生成SurXml文档。
将SurXml文档转换为XML文档的具体过程包括:
a、得到SurXml的文档类型定义,如果是Schema或DTD或Relax NG,则无需进一步处理;如果是自定义类型表,则需要将自定义的类型表转换为Schema或DTD或Relax NG。
b、遍历SurXml文档中的树型结构,根据各个结点在文档类型定义中对应的定义,将结点转换为XML元素并设置对应的属性。
本步骤中的过程是递归的,子结点将转换为XML文档中的子元素。
c、根据步骤a和b的结果生成XML文档。
以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种文档的存储方法,其特征在于,预先配置由至少一种结点类型定义的且具有树型结构文档类型,设置包括结点索引表和结点数据区的文档存储格式,该方法包括:
确定文档的文档类型,,根据该文档类型,将文档的内容映射为对应树型结构中的各个结点及其数据;
根据对应的树型结构中的各个结点及其数据,为文档分配存储空间,在分配的存储空间中为结点索引表和结点数据区分配各自的存储区域;
在分配的结点数据区中存储结点的数据,并在分配的结点索引表中记录每个结点与该结点数据存储位置的对应关系。
2.根据权利要求1所述的方法,其特征在于,所述文档存储格式中进一步设置有文件头,在分配的存储空间中进一步为文件头分配存储区域,在文件头中存储文件的标识信息和访问文档的入口信息。
3.根据权利要求1所述的方法,其特征在于,所述存储文档类型的方法为:将所述文档类型的部分或全部信息存储在为所述文档分配的存储空间中;或者,
将所述文档类型的部分或全部信息存储在文档的外部,并将存储该文档类型的部分或全部信息的统一资源定位URL或路径信息存储在为所述文档分配的存储空间中;或者,
将所述文档类型的部分或全部信息存储在访问文档的程序逻辑中,为所述文档类型的部分或全部信息分配标识ID,将该ID信息存储在为所述文档分配的存储空间中。
4.根据权利要求1所述的方法,其特征在于,所述文档类型的信息包括:文档中包含的结点类型、结点名称、结点属性的名称和类型、结点间的父子关系。
5.根据权利要求1所述的方法,其特征在于,所述结点的数据包括结点类型标记、结点长度、结点的属性的名称/标记和值、相关结点索引信息。
6.根据权利要求5所述的方法,其特征在于,所述相关结点索引信息包括:结点最左侧子结点ID和结点的子结点数目。
7.根据权利要求6所述的方法,其特征在于,所述相关结点索引信息进一步包括:结点的父结点标识ID,和/或,结点左右兄弟结点ID,和/或,结点的所有子结点ID。
8.根据权利要求1所述的方法,其特征在于,
所述为文档分配的存储空间包括超级块、i结点inode表和数据块;
所述超级块包括空闲块表和空闲inode表,用于所述存储空间中空闲空间的管理。
9.根据权利要求8所述的方法,其特征在于,
所述为结点索引表分配存储区域为:为结点索引表设置一个inode,利用inode/空闲表freelist机制在所述数据块部分为所述结点索引表分配存储区域;
所述为结点数据区分配存储区域为:为结点数据区设置一个inode,利用inode/freelist机制在所述数据块部分为所述结点数据区分配存储区域。
10.根据权利要求8所述的方法,其特征在于,在所述超级块中进一步包括inode0,用于记录inode表所占用的数据块号。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310441740.4A CN104462147A (zh) | 2013-09-25 | 2013-09-25 | 一种文档的存储方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310441740.4A CN104462147A (zh) | 2013-09-25 | 2013-09-25 | 一种文档的存储方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN104462147A true CN104462147A (zh) | 2015-03-25 |
Family
ID=52908202
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310441740.4A Pending CN104462147A (zh) | 2013-09-25 | 2013-09-25 | 一种文档的存储方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104462147A (zh) |
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105630879A (zh) * | 2015-12-17 | 2016-06-01 | 深圳市华讯方舟软件技术有限公司 | 一种PostgreSQL块存储设备读写模块 |
CN106021501A (zh) * | 2016-05-20 | 2016-10-12 | 天脉聚源(北京)传媒科技有限公司 | 一种数据存储方法及装置 |
CN106844421A (zh) * | 2016-11-30 | 2017-06-13 | 上海仙剑文化传媒股份有限公司 | 一种数字图片管理方法及系统 |
CN107526541A (zh) * | 2016-08-30 | 2017-12-29 | 腾讯科技(深圳)有限公司 | 数据处理方法和装置 |
CN109510998A (zh) * | 2018-12-21 | 2019-03-22 | 南京理工大学 | 获取未压缩的网络摄像头原始数据的方法 |
CN110336819A (zh) * | 2019-07-09 | 2019-10-15 | 四川新网银行股份有限公司 | 基于机器学习的加解密自助组合方法 |
WO2019218730A1 (zh) * | 2018-05-18 | 2019-11-21 | 中科声龙科技发展(北京)有限公司 | 一种工作量证明运算芯片核心计算部件的优化系统及方法 |
CN110489085A (zh) * | 2019-02-21 | 2019-11-22 | 贵州广思信息网络有限公司 | 一种word内容控件扩展存储数据的方法 |
CN110704450A (zh) * | 2019-10-14 | 2020-01-17 | 北京和利时系统工程有限公司 | 一种实现数据处理的方法、装置、计算机存储介质及终端 |
CN111897780A (zh) * | 2020-07-27 | 2020-11-06 | 百望股份有限公司 | 一种ofd文档的处理方法 |
CN112084127A (zh) * | 2020-08-24 | 2020-12-15 | 珠海格力电器股份有限公司 | 分布式控制器及分布式自控系统 |
CN112214461A (zh) * | 2020-10-12 | 2021-01-12 | 河南大学 | 一种遥感元数据的模糊xml压缩方法 |
-
2013
- 2013-09-25 CN CN201310441740.4A patent/CN104462147A/zh active Pending
Cited By (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105630879A (zh) * | 2015-12-17 | 2016-06-01 | 深圳市华讯方舟软件技术有限公司 | 一种PostgreSQL块存储设备读写模块 |
CN105630879B (zh) * | 2015-12-17 | 2019-03-26 | 深圳市华讯方舟软件技术有限公司 | 一种PostgreSQL块存储设备读写模块 |
CN106021501A (zh) * | 2016-05-20 | 2016-10-12 | 天脉聚源(北京)传媒科技有限公司 | 一种数据存储方法及装置 |
CN107526541A (zh) * | 2016-08-30 | 2017-12-29 | 腾讯科技(深圳)有限公司 | 数据处理方法和装置 |
CN107526541B (zh) * | 2016-08-30 | 2019-09-13 | 腾讯科技(深圳)有限公司 | 数据处理方法和装置 |
CN106844421A (zh) * | 2016-11-30 | 2017-06-13 | 上海仙剑文化传媒股份有限公司 | 一种数字图片管理方法及系统 |
WO2019218730A1 (zh) * | 2018-05-18 | 2019-11-21 | 中科声龙科技发展(北京)有限公司 | 一种工作量证明运算芯片核心计算部件的优化系统及方法 |
CN109510998A (zh) * | 2018-12-21 | 2019-03-22 | 南京理工大学 | 获取未压缩的网络摄像头原始数据的方法 |
CN110489085A (zh) * | 2019-02-21 | 2019-11-22 | 贵州广思信息网络有限公司 | 一种word内容控件扩展存储数据的方法 |
CN110336819A (zh) * | 2019-07-09 | 2019-10-15 | 四川新网银行股份有限公司 | 基于机器学习的加解密自助组合方法 |
CN110704450A (zh) * | 2019-10-14 | 2020-01-17 | 北京和利时系统工程有限公司 | 一种实现数据处理的方法、装置、计算机存储介质及终端 |
CN110704450B (zh) * | 2019-10-14 | 2023-02-17 | 北京和利时系统集成有限公司 | 一种实现数据处理的方法、装置、计算机存储介质及终端 |
CN111897780A (zh) * | 2020-07-27 | 2020-11-06 | 百望股份有限公司 | 一种ofd文档的处理方法 |
CN112084127A (zh) * | 2020-08-24 | 2020-12-15 | 珠海格力电器股份有限公司 | 分布式控制器及分布式自控系统 |
CN112214461A (zh) * | 2020-10-12 | 2021-01-12 | 河南大学 | 一种遥感元数据的模糊xml压缩方法 |
CN112214461B (zh) * | 2020-10-12 | 2022-09-30 | 河南大学 | 一种遥感元数据的模糊xml压缩方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104462147A (zh) | 一种文档的存储方法 | |
US10430398B2 (en) | Data storage system having mutable objects incorporating time | |
JP5152877B2 (ja) | 文書ベースシステムにおける文書データ記憶方法およびその装置 | |
JP5656563B2 (ja) | 文書管理システム、文書管理システムの制御方法、プログラム | |
US7730099B2 (en) | Storage and retrieval of richly typed hierarchical network models | |
CA2501608A1 (en) | System and method for schemaless data mapping with nested tables | |
CN103914483B (zh) | 文件存储方法、装置及文件读取方法、装置 | |
CN106682003B (zh) | 分布式存储命名空间的路径分割映射方法和装置 | |
US20130191328A1 (en) | Standardized framework for reporting archived legacy system data | |
US6714946B1 (en) | Data management system using a plurality of data operating modules | |
US8832046B2 (en) | Encoded data processing | |
CN104778192A (zh) | 表示可内容寻址存储系统的目录结构 | |
CN113590894A (zh) | 一种动态高效的遥感影像元数据入库检索方法 | |
CN102257497A (zh) | 可废弃文件的下载管理 | |
CN109947739B (zh) | 数据源管理方法及装置 | |
JP5063447B2 (ja) | コンテンツ管理装置及び方法及びプログラム | |
JP2007048318A (ja) | リレーショナルデータベースの処理方法およびリレーショナルデータベース処理装置 | |
Di Sarli et al. | GFS: A graph-based file system enhanced with semantic features | |
Sumrall et al. | Investigations on path indexing for graph databases | |
Kaporis et al. | ISB-tree: A new indexing scheme with efficient expected behaviour | |
CN112181899A (zh) | 一种元数据的处理方法、装置及计算机可读存储介质 | |
CN106980676A (zh) | 基于智能密钥盘的文件管理方法 | |
KR102500278B1 (ko) | 대량의 lod 저장을 위한 맵리듀스 기반 데이터 변환 시스템 및 방법 | |
JP2002007439A (ja) | 文書情報を管理するidテーブル作成方法 | |
Markova et al. | Distributed Data Addressed in Natural Language |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
WD01 | Invention patent application deemed withdrawn after publication | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20150325 |